-
Item 22. 인터페이스는 타입을 정의하는 용도로만 사용하라Book/Effective Java 3E 2022. 11. 2. 21:00반응형
인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 합니다. 인터페이스는 오직 이 용도로만 사용해야 합니다.
아래 상수 인터페이스 안티패턴은 인터페이스를 잘못 사용한 예입니다.
package effectivejava.chapter4.item22.constantinterface; // 코드 22-1 상수 인터페이스 안티패턴 - 사용금지! 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; }
상수를 공개할 목적이라면 더 합당한 선택지가 몇 가지 있습니다. 특정 클래스나 인터페이스와 강하게 연관된 상수라면 그 클래스나 인터페이스 자체에 추가해야 합니다. 모든 숫자 기본 타입의 박싱 클래스가 대표적으로, Integer와 Double에 선언된 MIN_VALUE와 MAX_VALUE 상수가 이런 예입니다. 열거 타입으로 나타내기 적합한 상수라면 열거 타입으로 만들어 공개하면 됩니다(Item 34). 그것도 아니라면, 인스턴스화할 수 없는 유틸리티 클래스(Item 4)에 담아 공개하면 됩니다. 다음 코드는 PhysicalConstants의 유틸리티 클래스 버전입니다.
package effectivejava.chapter4.item22.constantutilityclass; // 코드 22-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; }
Note) 숫자 리터럴에 사용한 밑줄(_)에 주목해보자. 자바 7부터 허용되는 이 밑줄은 숫자 리터럴의 값에는 아무런 영향을 주지 않으면서, 읽기는 훨씬 편하게 해준다. 고정소수점 수든 부동소수점 수든 5자리 이상이라면 밑줄을 사용하는 걸 고려해보자. 십진수 리터럴도 밑줄을 사용해 세 자릿씩 묶어주는 것이 좋다.
유틸리티 클래스에 정의된 상수를 클라이언트에서 사용하려면 클래스 이름까지 함께 몇시해야 합니다. PhysicalConstants.AVOGADROS_NUMBER처럼 말입니다. 정적 임포트(static import)하여 클래스 이름은 생략할 수 있습니다.
import static effectivejava.chapter4.item22.constantutilityclass.PhysicalConstants.*; public class Test { double atoms(double mols) { return AVOGADROS_NUMBER * mols; } ... // PhysicalConstants를 빈번히 사용한다면 정적 임포트가 값어치를 한다. }
인터페이스는 타입을 정의하는 용도로만 사용해야 한다.
상수 공개용 수단으로 사용하지 말자.
[참고 정보]
이펙티브 자바 Effective Java 3/E 도서 [조슈아 블로크 저]
반응형'Book > Effective Java 3E' 카테고리의 다른 글
Item 24. 멤버 클래스는 되도록 static으로 만들라 (2) 2022.11.06 Item 23. 태그 달린 클래스보다는 클래스 계층구조를 활용하라 (0) 2022.11.02 Item 21. 인터페이스는 구현하는 쪽을 생각해 설계하라 (0) 2022.10.29 Item 20. 추상 클래스보다는 인터페이스를 우선하라 (0) 2022.10.29 Item 19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라 (0) 2022.10.26