有一种接口被称为常量接口,这种接口不包括任何方法,只包含静态域,每个域导出常量,如下:

    1. // Constant interface antipattern - do not use!
    2. public interface PhysicalConstants {
    3. // Avogadro's number (1/mol)
    4. static final double AVOGADROS_NUMBER = 6.022_140_857e23;
    5. // Boltzmann constant (J/K)
    6. static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23;
    7. // Mass of the electron (kg)
    8. static final double ELECTRON_MASS = 9.109_383_56e-31;
    9. }

    这样的接口非常不好。如果有类实现这个接口,这些常量对于实现类没有用,而且该实现类和所有子类的命名空间会被接口中的常量污染。

    如果要使用常量有三种常用方式:

    1. 这些常量和哪个类或者接口紧密相关,则直接在类或者接口中声明这些常量,例如Integer和Double都到处MIN_VALUE和MAX_VALUE常量。
    2. 使用枚举类,这是最好的方式。
    3. 声明一些不可实例化的工具类,如下: ```java // Constant utility class package com.effectivejava.science;

    public class PhysicalConstants { private PhysicalConstants() { } // Prevents instantiation

    public static final double AVOGADROS_NUMBER = 6.022_140_857e23; public static final double BOLTZMANN_CONST = 1.380_648_52e-23; public static final double ELECTRON_MASS = 9.109_383_56e-31; }

    ``` 总结:接口应该只用来定义类型,而不是用来导出常量