[Effective Java 3/e] 아이템 22 - 인터페이스는 타입을 정의하는 용도로만 사용하라


아이템 22 - 인터페이스는 타입을 정의하는 용도로만 사용하라

상수 인터페이스 안티패턴 - 사용금지

public interface PhysicalConstants {
  static final double AVOGADROS_NUMBER = 6.022_140_857e23;
  static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23;
  static final double ELECTRON_MASS = 9.109_383_56e-31;
}
  • 상수 인터페이스 안티패턴은 인터페이스를 잘못 사용한 예
    • 클래스 내부에서 사용하는 상수는 내부 구현에 해당
      • 내부 구현을 클래스의 API로 노출하는 행위
    • 클라이언트 코드가 이 상수들에 종속되게 한다.

상수를 공개해야 하는 경우

  • 특정 클래스나 인터페이스와 강하게 연관된 상수라면 그 클래스나 인터페이스 자체에 추가해야 한다.
    • ex) Integer와 Double에 선언된 MIN_VALUE, MAX_VALUE
  • 열거 타입으로 만들어 공개
  • 인터스턴스화 할 수 없는 유틸리티 클래스에 담아 공개

상수 유틸리티 클래스

public class PhysicalConstants {
  private PhysicalConstants() {}  //인스턴스화 방지

  public static final double AVOGADROS_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-31;
}