클래스가 어떤 상수 인터페이스를 사용하던 사용자에게는 아무런 의미가 없고 오히려 혼란을 주게된다.
동시에 클라이언트 코드가 이 상수들에 종속되어 다음 릴리스에서 상수를 사용하지 않게 되더라도 여전히 상수 인터페이스를 구현해야 한다.
상수를 공개할 목적 대안책
클래스나 인터페이스 자체에 추가
ex> Integer와 Double 의 MIN_VALUE와 MAX_VALUE
public final class Integer extends Number implements Comparable<Integer> {
...
@Native public static final int MIN_VALUE = 0x80000000;
@Native public static final int MAX_VALUE = 0x7fffffff;
...
}
열거 타입(#34)
열거 타입으로 나타내기 적합한 상수라면 열거 타입으로 공개
enum class
유틸리티 클래스(#4)
인스턴스화할 수 없는 유틸리티 클래스를 구현해 공개
public class PhysicalConstants {
private PhysicalConstants() {} // 인스턴스화 방지
static final double AVOGADROS_NUMBER = 6.022_140_857e23;
static final double BOLTZMANN_NUMBER = 1.380_648_52e-23;
static final double ELECTRON_NUMBER = 9.109_383_56e-31;
}
유틸리티 클래스 사용할 경우
public class Test {
double atoms(double mols) {
return PhysicalConstants.AVOGADROS_NUMBER * mols;
}
}
정적 임포트를 사용하여 클래스 이름 생략
import static PhysicalConstants.*;
public class Test {
double atoms(double mols) {
return AVOGADROS_NUMBER * mols;
}
}
## 결론
> 인터페이스는 타입을 정의하는 용도로만 사용해야 한다. 상수 공개용 수단으로 사용하지 말자.
인터페이스 사용용도
인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 한다. 달리 말하면 클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에게 얘기하주는 것이다.
인터페이스는 반드시 위 용도로만 사용이 되어야한다.
잘못 사용된 경우
상수 인터페이스
클래스가 어떤 상수 인터페이스를 사용하던 사용자에게는 아무런 의미가 없고 오히려 혼란을 주게된다. 동시에 클라이언트 코드가 이 상수들에 종속되어 다음 릴리스에서 상수를 사용하지 않게 되더라도 여전히 상수 인터페이스를 구현해야 한다.
상수를 공개할 목적 대안책
클래스나 인터페이스 자체에 추가
ex> Integer와 Double 의 MIN_VALUE와 MAX_VALUE
열거 타입(#34)
유틸리티 클래스(#4)
public class Test { double atoms(double mols) { return AVOGADROS_NUMBER * mols; } }