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

인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 한다.

인터페이스를 잘못 사용하고 있는 예로 상수 인터페이스가 있다.

인터페이스 안티패턴 - 상수 인터페이스

상수 인터페이스란 메서드 없이, 상수를 뜻하는 static final 필드로만 가득 찬 인터페이스를 말한다.

자바 플랫폼 라이브러리에도 이와 같은 상수 인터페이스가 몇 개 있다. java.io.ObjectStreamConstants

public interface ObjectStreamConstants {
    final static short STREAM_MAGIC = (short)0xaced;
    final static short STREAM_VERSION = 5;
}

상수는 내부 구현에 해당해서 클래스의 API로 노출하는 행위다. 따라서 인터페이스의 역할과는 멀다.

또한, 클라이언트 코드가 이 상수들에 종속되버려서 상수를 쓰지 않아도 이 상수 인터페이스를 구현하고 있어야 한다.

상수를 공개할 목적이라면 아래 방식으로 구현해야 한다.

  • 클래스 자체에 추가해야 한다. (Integer, Double의 MAX_VALUE, MIN_VALUE 처럼)
  • 열거타입으로 만들어 공개한다.
  • 인스턴스화할 수 없는 유틸리티 클래스 아이템4에 담아 공개하자.
  public class PhysicalConstants {
    private PhysicalConstants() {} // 인스턴스화 방지

    public static final double AVOGADROS_NUMBER = 6.022_140_857e23;
  }

댓글남기기