第19条:接口只用于定义类型

当类实现接口,接口就充当可以引用这个类的实例的类型。因此,类实现了接口,就表明客户端可以对这个类的实例实施某些动作,为了其他任何目的而定义接口是不恰当的。

有一种常量接口,它不包含任何方法,只包含静态的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 包名.工具类名.*;这样。

原文地址:https://www.cnblogs.com/13jhzeng/p/5705886.html