
package me.whiteship.chapter04.item22.constantinterface;
// 코드 22-1 상수 인터페이스 안티패턴 - 사용금지! (139쪽)
public interface PhysicalConstants {
// 아보가드로 수 (1/몰)
static final double AVOGADROS_NUMBER = 6.022_140_857e23;
// 볼츠만 상수 (J/K)
static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23;
// 전자 질량 (kg)
static final double ELECTRON_MASS = 9.109_383_56e-31;
}
package me.whiteship.chapter04.item22.constantinterface;
public class MyClass implements PhysicalConstants {
public static void main(String[] args) {
System.out.println(BOLTZMANN_CONSTANT);
}
}
안티패턴이다. 인터페이스의 원래 의도를 오염시키기 때문이다.
interface는 타입을 정의하려고 만든 것이다.
interface에 정의된 상수들은 클래스 내부에서 사용하려고 만든 것인데 클래스 내부 정보가 인터페이스를 통해서 공개되었기 때문에 어떻게 보면 캡슐화가 깨진 거고 내부 구현이 외부로 노출되었다고 볼 수 있다.
상수를 정의하기 위해서 interface를 사용하지 말라는 의미다.
인스턴스를 만들 수 없는 utility 성 클래스를 만들어라.
package me.whiteship.chapter04.item22.constantutilityclass;
// 코드 22-2 상수 유틸리티 클래스 (140쪽)
public fianl class PhysicalConstants {
private PhysicalConstants() { } // 인스턴스화 방지
// 아보가드로 수 (1/몰)
public static final double AVOGADROS_NUMBER = 6.022_140_857e23;
// 볼츠만 상수 (J/K)
public static final double BOLTZMANN_CONST = 1.380_648_52e-23;
// 전자 질량 (kg)
public static final double ELECTRON_MASS = 9.109_383_56e-31;
}
private를 쓰는 생성자는 상속을 막을 수 있다. class에 final 까지를 사용하면 더 좋을 것이다.