当类实现接口,接口就充当可以引用这个类的实例的类型。因此,类实现了接口,就表明客户端可以对这个类的实例实施某些动作,为了其他任何目的而定义接口是不恰当的。
有一种常量接口,它不包含任何方法,只包含静态的final域,每个域导出一个常量,使用这些常量的类实现这个接口,以避免用类名来修饰常量名:
public interface PhysicalConstants { static final double AVOGADROS_NUMBER = 6.022e23; static final double BOLTZMANN_CONSTANT = 1.380e-23; static final double ELECTRON_MASS = 9.109e-31; }
这是对接口的不良使用,类在内部使用这些常量,是实现细节,不应该将实现细节暴露到该类的导出API中。
导出常量的几种方案:
1.如果常量与某个现有的类或者接口紧密相关,就应该把这些常量添加到这个类或者接口中,如Integer和Double,都导出MIN_VALUE和MAX_VALUE常量。
2.如果常量被看作枚举类型,就应该使用枚举类型。
3.否则,应该使用不可实例化的工具类来导出这些常量 :
public class PhysicalConstants { private PhysicalConstants() {}; static final double AVOGADROS_NUMBER = 6.022e23; static final double BOLTZMANN_CONSTANT = 1.380e-23; static final double ELECTRON_MASS = 9.109e-31; }
通过类名.常量名来引用这些常量,如果大量利用工具类导出的常量,可以利用静态导入机制,1.5后才有。像import static 包名.工具类名.*;这样。