有一种接口被称为常量接口,这种接口不包括任何方法,只包含静态域,每个域导出常量,如下:
// Constant interface antipattern - do not use!
public interface PhysicalConstants {
// Avogadro's number (1/mol)
static final double AVOGADROS_NUMBER = 6.022_140_857e23;
// Boltzmann constant (J/K)
static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23;
// Mass of the electron (kg)
static final double ELECTRON_MASS = 9.109_383_56e-31;
}
这样的接口非常不好。如果有类实现这个接口,这些常量对于实现类没有用,而且该实现类和所有子类的命名空间会被接口中的常量污染。
如果要使用常量有三种常用方式:
- 这些常量和哪个类或者接口紧密相关,则直接在类或者接口中声明这些常量,例如Integer和Double都到处MIN_VALUE和MAX_VALUE常量。
- 使用枚举类,这是最好的方式。
- 声明一些不可实例化的工具类,如下: ```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; }
``` 总结:接口应该只用来定义类型,而不是用来导出常量