Skip to content

Latest commit

 

History

History
53 lines (39 loc) · 2.24 KB

File metadata and controls

53 lines (39 loc) · 2.24 KB

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

작성자: 김대희

작성일: 2022년 5월 3일


인터페이스는 참조 타입 역할을 한다.

  • 클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인스턴스로 무엇을 할 수 있는지 클라이언트에게 얘기해주는 것.
  • 인터페이스는 오직 이 용도로만 사용해야한다.

상수 인터페이스 (안티패턴)

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_MAXX = 9      .109_383_56e-31;
}
  • 이러한 상수 인터페이스 안티패턴은 인터페이스를 잘못 사용한 예이다.
  • 클래스 내부에서 사용하는 상수는 외부 인터페이스가 아니라 내부 구현에 해당한다.
    • 상수 인터페이스를 구현하는 것은 내부 구현을 API로 노출하는 행위.
    • 클라이언트 코드가 이 상수(내부 구현)에 종속되게 한다.
      • 호환성을 위해 내부 구현(상수)을 변경할 수 없게된다.
    • final이 아닌 클래스가 상수 인터페이스를 구현한다면 모든 하위 클래스들의name space가 그 인터페이스가 정의한 상수들로 오염되어버린다.

상수를 공개할 목적이라면?

  • 더 합당한 선택지
    • 특정 클래스나 인터페이스 자체에 추가해야한다.

      • 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_MAXX = 9.109_383_56e-31;
      }
      • PhysicalConstants.AVOGADROS_NUMBER 처럼 사용해야 하며, static import를 한다면 클래스 이름 없이 사용할 수 있다.
💡 인터페이스는 타입을 정의하는 용도로만 사용해야한다. 상수 공개용 수단으로 사용하지 말자.