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
상수
- ex. 숫자 기본 타입 박싱 클래스의
- 열거 타입으로 나타내기 적합한 상수라면 열거 타입으로 만들어 공개한다.
- 인스턴스화 할 수 없는 유틸리티 클래스
- 유틸리티 클래스의 상수를 자주 사용한다면 정적 임포트하여 클래스 이름 생략 가능.
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.