接口只用来定义类型

接口只用来定义类型

概述

当一个类实现了一个接口,那么这个接口可以作为一个类型,并作为实现它的类实例的引用。这是定义一个接口的目的。

常量接口

但常量接口比较特殊,不包含方法,仅仅由静态final域组成:

1
2
3
4
5
6
7
8
9
// 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;
}

但常量接口是比较糟糕的做法,一是因为实现一个接口会导致类的导出API泄露了这个实现细节;二是因为如果我们不再需要这些常量,但为了保证二进制兼容仍然需要实现这个接口,如果它还是个非final类,那么它的所有子类命名空间都会被污染。

总结

接口应该只被用来定义类型,它们不能仅仅用来导出常量。