아이템22 | 인터페이스는 타입을 정의하는 용도로만 사용하라
자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할
ex) Map<String, Integer> mp = new HashMap<>();
자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에게 알려줌
잘못된 인터페이스 사용 - 상수 인터페이스 안티패턴
public interface PhysicalConstants {
static final double AVOGARDROS_NUMBER = 6.022_140_857e23 ;
static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23 ;
static final double ELECTRON_MASS = 9.109_383_56e-3 ;
}
클래스 내부의 상수는 외부 인터페이스가 아니라 내부 구현에 해당됨
상수 인터페이스는 내부 구현을 클래스의 API로 노출하는 행위
클라이언트 코드가 내부 구현에 해당하는 상수들에 종속되게 함
다음 릴리즈에서 상수를 사용하지 않게 변경되더라도 호환성을 위해 인터페이스 유지필요
final이 아닌 클래스가 상수 인터페이스를 구현하면 모든 하위 클래스가 상수들로 오염됨
public final class Integer extends Number
implements Comparable <Integer >, Constable , ConstantDesc {
@ Native public static final int MIN_VALUE = 0x80000000 ;
@ Native public static final int MAX_VALUE = 0x7fffffff ;
...
}
3. 인스턴스화 할 수 없는 유틸리티 클래스에 담아 공개하라.
public class PysicalConstants {
private PysicalConstants (){}; // 인스턴스화 방지
public static final double AVOGARDROS_NUMBER = 6.022_140_857e23 ;
public static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23 ;
public static final double ELECTRON_MASS = 9.109_383_56e-3 ;
}