-
Item 22. 인터페이스는 타입을 정의하는 용도로만 사용하라백수의 개발/이펙티브 자바 2019. 10. 8. 12:00
인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 한다.
즉, 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에 얘기해주는 것이다. 따라서 인터페이스는 오직 이 용도로만 사용해야 한다.
이 지침에 맞지 않는 예로 상수 인터페이스라는 것이 있다. 이는 상수를 뜻하는 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; }
위와 같은 상수 인터페이스는 안티패턴이고, 인터페이스를 잘못 사용한 예다.
상수 공개하기
상수 인터페이스는 안티패턴이다. 그렇다면 특정 클래스나 인터페이스에 강하게 연관된 상수라면 어떻게 구현해야할까?
- 해당 클래스나 인터페이스 자체에 추가야한다.(예, Integer, Double 클래스의 MIN_VALUE, MAX_VALUE 상수)
- 열거 타입으로 나타내기 적합한 상수라면 열거 타입으로 만들어 공개하면 된다.
- 인스턴스화할 수 없는 유틸리티 클래스에 담아 공개하자.
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; }
마무리
인터페이스는 타입을 정의하는 용도로만 사용해야 한다. 상수 공개용 수단으로 사용하지 말자.
'백수의 개발 > 이펙티브 자바' 카테고리의 다른 글
Item 24. 멤버 클래스는 되도록 static으로 만들라 (0) 2019.10.12 Item 23. 태그 달린 클래스보다는 클래스 계층구조를 활용하라 (0) 2019.10.11 Item 21. 인터페이스는 구현하는 쪽을 생각해 설계하라 (0) 2019.10.07 Item 20. 추상 클래스보다는 인터페이스를 우선하라 (0) 2019.10.06 Item 19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라 (0) 2019.10.05