자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에 얘기해주는 것이며, 반드시 해당 용도로만 사용해야 한다.
지침에 맞지 않는 예
❎ 상수 인터페이스
메서드 없이, 상수를 뜻하는 static final 필드로만 가득 찬 인터페이스이며, 이 상수들을 사용하기 위해 클래스에서는 정규화된 이름을 쓰는 걸 피하고자 해당 인터페이스를 구현한다.
public interface PhysicalConstants {
// 아보가르드 수
static final double AVOGADROS_NUMBER = 6.022_140_857e23;
// 볼츠만 상수
static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23;
}
👆 상수 인터페이스 안티패턴으로 인터페이스를 잘못 사용한 예
상수는 외부 인터페이스가 아니라 내부 구현에 해당 => 내부 구현을 클래스의 API로 노출하는 행위
해당 인터페이스를 사용하는 사용자에게는 아무런 의미가 없음
클라이언트 코드가 내부 구현에 해당하는 상수들에게 종속되게 만듦
final이 아닌 클래스가 상수 인터페이스를 구현한다면 모든 하위 클래스의 이름 공간이 그 인터페이스가 정의한 상수들로 오염됨
public interface TestInterFace {
static String NAME = "yerim";
}
public class InterfaceImpl implements TestInterFace {
public static void main(String[] args) {
System.out.println(NAME);
}
}
// result : yerim
public class InterfaceImpl implements TestInterFace {
public static final String NAME = "test";
public static void main(String[] args) {
System.out.println(NAME);
}
}
// result : test
상수 공개 목적의 올바른 구현 방법
특정 클래스나 인터페이스와 강하게 연관된 상수라면 그 클래스나 인터페이스 자체에 추가
🐣 좋은 예시로 Integer.MIN_VALUE, Integer.MAX_VALUE
열거 타입으로 나타내기 적합한 상수라면 열거 타입으로 만들어서 공개
인스턴스화할 수 없는 유틸리티 클래스에 담아서 공개
package effectivejava. chapter4. item22. constantutilityclass;
public class PhysicalConstants {
private PhysicalConstants() { } // 인스턴스화방지
// 아보가드로수(1/몰)
public static final double AVOGADROS_NUMBER = 6.022_140_85723;
// 볼츠만상수(J/K)
public static final double BOLTZMANN_CONST = 1.380_648_52-23;
}
🐣 이렇게 적으면 PhysicalConstants.AVOGADROS_NUMBER 이 가능하다.
✅ 빈번하게 사용한다면 정적 import 하여 클래스 이름을 생략할 수 있다.
import static effectivejava.chapter4.item22. constantutilityclass. Physical Constants.*;
public class Test {
double atoms (double mols) {
return AVOGADROS_NUMBER * mols;
}
}
Chapter : 4. 클래스와 인터페이스
Item : 22. 인터페이스는 타입을 정의하는 용도로만 사용하라
Assignee : Lainlnya
🍑 서론
🍑 본론
인터페이스의 역할
자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에 얘기해주는 것이며, 반드시 해당 용도로만 사용해야 한다.
지침에 맞지 않는 예
❎ 상수 인터페이스
메서드 없이, 상수를 뜻하는 static final 필드로만 가득 찬 인터페이스이며, 이 상수들을 사용하기 위해 클래스에서는 정규화된 이름을 쓰는 걸 피하고자 해당 인터페이스를 구현한다.
👆 상수 인터페이스 안티패턴으로 인터페이스를 잘못 사용한 예
상수 공개 목적의 올바른 구현 방법
특정 클래스나 인터페이스와 강하게 연관된 상수라면 그 클래스나 인터페이스 자체에 추가 🐣 좋은 예시로 Integer.MIN_VALUE, Integer.MAX_VALUE
열거 타입으로 나타내기 적합한 상수라면 열거 타입으로 만들어서 공개
인스턴스화할 수 없는 유틸리티 클래스에 담아서 공개
🐣 이렇게 적으면 PhysicalConstants.AVOGADROS_NUMBER 이 가능하다.
✅ 빈번하게 사용한다면 정적 import 하여 클래스 이름을 생략할 수 있다.
🍑 결론
인터페이스는 타입을 정의하는 용도로 사용해야 한다. 상수 공개용 수단으로 사용하지 말자.
Referenced by
-