Post

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

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

인터페이스는 이 용도로만 사용해야 한다.

상수 인터페이스는 메서드 없이 static final 필드로만 가득 찬 인터페이스로,

인터페이스를 잘못 사용한 예이다.

1
2
3
4
5
public interface PhysicalConstants {
    static final double ABOGADROS_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. 숫자 기본 타입 박싱 클래스의 MIN_VALUE, MAX_VALUE 상수
  • 열거 타입으로 나타내기 적합한 상수라면 열거 타입으로 만들어 공개한다.
  • 인스턴스화 할 수 없는 유틸리티 클래스
    • 유틸리티 클래스의 상수를 자주 사용한다면 정적 임포트하여 클래스 이름 생략 가능.
1
2
3
4
5
6
7
public class PhysicalConstants {
    private PhysicalConstants() {} // 인스턴스화 방지
    
    public static final double ABOGADROS_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;
}

💡 핵심 정리

인터페이스는 타입을 정의하는 용도로만 사용하고, 상수 공개용 수단으로 사용하지 말자.

This post is licensed under CC BY 4.0 by the author.