인터페이스는 자신을 구현할 클래스의 인스턴스를 참조할 수 있는 타입
역할을 한다.
인터페이스는 오직 이 용도로만 사용해야 한다.
인터페이스를 타입을 정의하는 용도로 사용하지 않은 대표적인 예로 상수 인터페이스를 들 수 있다.
상수 인터페이스
란, 메서드 없이 상수를 뜻하는 static final 필드로만 가득 찬 인터페이스를 말한다.
// 상수 인터페이스 안티패턴 - 사용금지!
public interface PhysicalConstants {
// 아보가드로 수 (1/몰)
static final double AVOGADROS_NUMBER = 6.022_140_857e23;
// 볼츠만 상수 (J/K)
static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23;
// 전자 질량 (kg)
static final double ELECTRON_MASS = 9.109_383_56e-31;
}
위와 같은 상수 인터페이스 안티패턴은 인터페이스를 잘못 사용한 예다.
상수 인터페이스를 구현하는 것은 이 내부 구현을 클래스의 API로 노출하는 행위다.
상수를 공개할 목적이라면, 이 외에 적당한 선택지 2가지가 있다.
열거 타입
으로 만들어 공개한다.유틸리티 클래스
에 담아 공개한다.앞의 예제의 유틸리티 클래스 버전이다.
// 상수 유틸리티 클래스
public class PhysicalConstants {
private PhysicalConstants() { } // 인스턴스화 방지
// 아보가드로 수 (1/몰)
public static final double AVOGADROS_NUMBER = 6.022_140_857e23;
// 볼츠만 상수 (J/K)
public static final double BOLTZMANN_CONST = 1.380_648_52e-23;
// 전자 질량 (kg)
public static final double ELECTRON_MASS = 9.109_383_56e-31;
}
상수를 사용할 때는 정적 임포트(static import)를 통해 클래스 이름을 생략할 수 있다.
import static effectivejava.chapter4.item22.constantutilityclass.PhysicalConstants.*;
public class Test {
double atoms(double mols) {
return AVOGADROS_NUMBER * mols;
}
}
📌 핵심 정리
인터페이스는 타입을 정의하는 용도로만 사용해야 한다.
상수 공개용 수단으로 사용하지 말자.