Skip to content

Latest commit

 

History

History
55 lines (38 loc) · 2.17 KB

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

File metadata and controls

55 lines (38 loc) · 2.17 KB

아이템 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;
}

문제점

  1. 상수 인터페이스를 구현하는건 내부 구현을 클래스의 api로 노출하는 행위다.
    • 클래스 내부에서 사용하는 상수는 외부 인터페이스가 아닌 내부 구현에 해당함
    • 클라이언트 코드가 내부 구현에 해당하는 이 상수들에 종속되게 한다.
  2. final이 아닌 클래스가 상수 인터페이스를 구현하면 모든 하위 클래스의 이름공간이 그 인터페이스가 정의한 상수들로 오염된다.

대안 (상수 공개)

1. 특정 클래스나 인터페이스에 강하게 연관된 상수라면 클래스나 인터페이스 자체에 추가하자.

2. 상수를 열거타입으로 만드는 방법 (아이템 34)

3. 인스턴스화 할 수 없는 유틸리티 클래스로 만드는 방법 (아이템 4)

public class PhysicalConstants {
  private PhysicalConstants() { }  // 인스턴스화 방지
  public static final double AVOGADROS_NUMBER = 6.022_140_857e23;
  public static final double BOLTZMANN_CONST  = 1.380_648_52e-23;
  public static final double ELECTRON_MASS    = 9.109_383_56e-31;
}

용어 조사

  • fully qualified name?
    • 클래스가 속한 패키지 명을 모두 포함한 이름을 뜻한다.
    • 예를 들어 String을 구현하는 방법에는 String s = new String()java.lang.String s = new java.lang.String()이 있다.
    • 후자가 qualified name, 전자가 alias name