-
22. 인터페이스는 타입을 정의하는 용도로만 사용하라JAVA/Effective java 2021. 3. 6. 19:34
- 인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 한다.
- 즉, 클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에게 이야기하는 것이며 인터페이스는 오직 이 용도로만 사용해야 한다.
- 이 지침에 맞지 않는 예로 소위 상수 인터페이스라는 것이 있다.
- 상수를 뜻하는 static final 필드로만 가득 찬 인터페이스가 이를 말한다.
- 이 상수들을 사용하려는 클래스에서는 정규화된 이름을 쓰는 걸 피하고자 그 인터페이스를 구현하곤 한다.
- 상수 인터페이스 안티패턴은 인터페이스를 잘못 사용한 예다.
- 클래스 내부에서 사용하는 상수는 외부 인터페이스가 아니라 내부 구현에 해당한다.
- 따라서 상수 인터페이스를 구현하는 것은 이 내부 구현을 클래스의 API로 노출하는 행위다.
- 클래스가 어떤 상수 인터페이스를 사용하든 사용자에게는 아무런 의미가 없다.
- 오히려 사용자에게 혼란을 주기도 하며, 클라이언트 코드가 내부 구현에 해당하는 이 상수들에 종속되게 한다.
- final이 아닌 클래스가 상수 인터페이스를 구현한다면 모든 하위 클래스의 이름공간이 그 인터페이스가 정의한 상수들로 오염되어 버린다.
상수를 공개할 목적이라면 더 합당한 선택지가 몇 있다.
- 특정 클래스나 인터페이스와 강하게 연관된 상수라면 그 클래스나 인터페이스 자체에 추가해야 한다.
- 모든 숫자 기본 타입의 박싱 클래스가 대표적으로, Integer와 Double에 선언된 MIN_VALUE와 MAX_VALUE 상수가 예다.
- 열거 타입으로 나타내기 적합한 상수라면 열거 타입으로 만들어 공개하면 된다.
- 그것도 아니라면, 인스턴스화할 수 없는 유틸리티 클래스에 담아 공개하자.
- 다음은 PhysicalConstants의 유틸리티 클래스 버전이다.
핵심 정리
- 인터페이스는 타입을 정의하는 용도로만 사용해야 한다. 상수 공개용 수단으로 사용하지 말자.
참고 자료
'JAVA > Effective java' 카테고리의 다른 글
24. 멤버 클래스는 되도록 static으로 만들라 (0) 2021.03.08 23. 태그 달린 클래스보다는 클래스 계층구조를 활용하라 (0) 2021.03.07 21. 인터페이스는 구현하는 쪽을 생각해 설계하라 (0) 2021.03.04 20. 추상 클래스보다는 인터페이스를 우선하라 (0) 2021.03.03 19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라 (0) 2021.03.02