1、写在开头
当类实现接口时,接口就可以充当引用这个类的实例的类型(type)。因此,类实现了接口,就表明客户端可以对这个类的实例实施某些动作。除此之外,为了任何其他目的而定义接口都是使用不恰当的。
2、接口使用误区:常量接口
常量接口模式是对接口的不良使用。
类实现常量接口,对于类的使用者没有任何价值。
后续发行版本中,如果类被修改而不需要这些常量了,但是该类必须实现这个接口,因为要确保二进制兼容性。
如果该类是 final 类,它的所有子类的命名空间都会被接口的常量所“污染”。
public interface PhysicalConstantsInterface {
static final double AVOGADROS_NUMBER = 6.02214199e23;
static final double BOLTZMANN_CONSTANT = 1.3806503e-23;
static final double ELECTRON_MASS = 9.10938188e-31;
}
复制代码
Java 库其实也有反面教材,例如 java.io.ObjectStreamConstants,我们不应该效仿:
/**
* Constants written into the Object Serialization Stream.
*
* @author unascribed
* @since JDK 1.1
*/
public interface ObjectStreamConstants {
/**
* Magic number that is written to the stream header.
*/
final static short STREAM_MAGIC = (short)0xaced;
/**
* Version number that is written to the stream header.
*/
final static short STREAM_VERSION = 5;
/* Each item in the stream is preceded by a tag
*/
/**
* First tag value.
*/
final static byte TC_BASE = 0x70;
}
复制代码
3、常量接口的优化方案
对于如何合理导出常量,有 3 种合理方案:
public final class Integer extends Number implements Comparable<Integer> {
/**
* A constant holding the minimum value an {@code int} can
* have, -2<sup>31</sup>.
*/
@Native public static final int MIN_VALUE = 0x80000000;
/**
* A constant holding the maximum value an {@code int} can
* have, 2<sup>31</sup>-1.
*/
@Native public static final int MAX_VALUE = 0x7fffffff;
}
复制代码
public class PhysicalConstants {
static final double AVOGADROS_NUMBER = 6.02214199e23;
static final double BOLTZMANN_CONSTANT = 1.3806503e-23;
static final double ELECTRON_MASS = 9.10938188e-31;
}
复制代码
在 jdk1.5 之后,引入静态导入机制,我们可以避免使用类名来修饰常量名。
import static effectivejava.no19.PhysicalConstants.AVOGADROS_NUMBER;
public class Test {
double atoms(double mols){
return AVOGADROS_NUMBER * mols;
}
}
复制代码
4、总结
简而言之,接口应该只用来定义类型,不应该被用来导出常量。
评论