-
아이템22. 인터페이스는 타입을 정의하는 용도로만 사용하라책/이펙티브자바 2021. 8. 24. 11:50
클래스가 어떤 인터페이스를 구현한다 → 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에 얘기해준다.
인터페이스는 오직 이 용도로만 사용해야 한다.
안티패턴
이 사용 용도에 맞지 않는 잘못된 예로 상수 인터페이스라는 것이 있다.
public interface PhysicalConstants { static final double AVOGADROS_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로 노출하는 행위다.
이 행위는 사용자에게 혼란을 주기도 하며, 클라이언트 코드가 내부 구현에 해당하는 이 상수들에 종속되게 한다.
만약 상수를 공개할 목적이라면 다른 선택지가 있다.
특정 클래스나 인터페이스와 강하게 연관된 상수라면 그 클래스나 인터페이스 자체에 추가해야 한다.
예시로 기본타입의 박싱 클래스가 대표적이다.
// Integer.java @Native public static final int MIN_VALUE = 0x80000000; @Native public static final int MAX_VALUE = 0x7fffffff;
상수 인터페이스 해결책
열거타입으로 나타내기 적합한 상수라면 열거타입으로 (Item34)
인스턴스화 할 수 없는 유틸리티 클래스로 (Item4) 에 담아 공개하자.
// 22-2. 상수 유틸리티 클래스 public class PhysicalConstants { private PhysicalConstants() { } public static final double AVOGADROS_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; }
// static import 사용시 클래스 이름 생략 가능 import static me.kingsubin.studyrepo.book.effectiveJava.PhysicalConstants.BOLTZMANN_CONSTANT; public class Item22 { double test() { return BOLTZMANN_CONSTANT; } }
결론
- 인터페이스는 타입을 정의하는 용도로만 사용해야 한다.
- 상수 공개용 수단으로 사용하지 말자.
'책 > 이펙티브자바' 카테고리의 다른 글
아이템25. 톱레벨 클래스는 한 파일에 하나만 담으라 (0) 2021.08.24 아이템23. 태그 달린 클래스보다는 클래스 계층구조를 활용하라 (0) 2021.08.24 아이템21. 인터페이스는 구현하는 쪽을 생각해 설계하라 (0) 2021.08.24 아이템20. 추상 클래스보다는 인터페이스를 우선하라 (0) 2021.08.18 아이템19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라 (0) 2021.08.17