-
아이템 22. 인터페이스는 타입을 정의하는 용도로만 사용하라Study/Effective Java 2023. 8. 10. 08:59
인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 한다. 클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에 얘기해주는 것이다. 인터페이스는 오직 이 용도로만 사용해야 한다.
상수 인터페이스 안티패턴은 인터페이스의 의도를 오염시키는, 인터페이스를 잘못 사용한 예다.
상수 인터페이스는 메서드 없이, 상수를 뜻하는 static final필드만 가득 찬 인터페이스를 뜻한다.
// 코드 22-1 상수 인터페이스 안티패턴 - 사용금지! (139쪽) 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; }
public class MyClass implements PhysicalConstants { public static void main(String[] args) { System.out.println(BOLTZMANN_CONSTANT); } }
위처럼 NAMESPACE없이 상수를 사용하고자 인터페이스를 구현하곤 한다.
클래스 내부에서 사용하는 상수는 외부 인터페이스가 아니라 내부 구현에 해당한다. 따라서 상수 인터페이스를 구현하는 것은 이 내부 구현을 클래스의 API로 노출하는 행위다.
java.io.ObjectStreamConstants
등, 자바 플랫폼 라이브러리에도 상수 인터페이스가 몇 개 있으나, 인터페이스를 잘못 활용한 예이니 따라 해서는 안된다.https://docs.oracle.com/javase%2F7%2Fdocs%2Fapi%2F%2F/java/io/ObjectStreamConstants.html
상수를 공개할 목적이라면 합당한 선택지가 몇 가지 있다.
1) 특정 클래스나 인터페이스와 강하게 연관된 상수라면 그 클래스나 인터페이스 자체에 추가해야 한다.
Integer
와Double
에 선언된MIN_VALUE
와MAX_VALUE
상수가 이런 예이다.2) 열거 타입으로 나타내기 적합한 상수라면 열거 타입으로 만들어 공개하면 된다. (아이템 34)
3) 인스턴스화할 수 없는 유틸리티 클래스에 담아 공개하자. (아이템 4)
// 코드 22-2 상수 유틸리티 클래스 (140쪽) 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; }
'Study > Effective Java' 카테고리의 다른 글
아이템 24. 멤버 클래스는 되도록 static으로 만들라 (0) 2023.08.10 아이템 23. 태그 달린 클래스보다는 클래스 계층구조를 활용하라 (0) 2023.08.10 아이템 21. 인터페이스는 구현하는 쪽을 생각해 설계해라. (0) 2023.08.10 아이템 20. 추상 클래스보다는 인터페이스를 우선하라 (0) 2023.08.03 아이템 19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라. (0) 2023.08.02