Skip to content

Latest commit

 

History

History
52 lines (38 loc) · 1.92 KB

인터페이스는_타입을_정의하는_용도로만_사용하라.md

File metadata and controls

52 lines (38 loc) · 1.92 KB

아이템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이 아닌 클래스가 상수 인터페이스를 구현하면 모든 하위 클래스가 상수들로 오염됨

상수 공개 방법

1. 클래스나 인터페이스 자체에 추가하라

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;
 
    ...   
}

2. 열거 타입을 사용하라

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;
}