1. 인터페이스의 용도
인터페이스란 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할이다. 클래스가 어떤 인터페이스를 구현하는 것은 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에게 얘기해주는 것이다
2. 안티 패턴 : 상수 인터페이스
PhysicalConstants.java
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를 노출하는 행동과 다름없다.
클라이언트를 혼란시키며 오히려 클라이언트 코드가 해당 상수들을 의존하게 될 수도 있다. 특히 final이 아닌 클래스가 해당 인터페이스를 구현하면 모든 하위 클래스의 이름 공간이 해당 인터페이스가 정의한 상수들로 오염된다.
상수를 공개할 목적이라면 다음 사항들을 고려하라.
- 특정 클래스(인터페이스)와 강하게 연관된 상수는 해당 클래스(인터페이스) 자체에 추가한다.
- 열거 타입을 사용한다.
- 인스턴스화 할 수 없는 유틸리티 클래스에 담아 공개한다.
상수 인터페이스 방지 하는 클래스
public class PhysicalConstants {
private 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;
}
// 숫자 리터널에 사용한 밑줄(_)
// 자바 7부터 ㄹ허용되는 이 밑줄은 숫자 리터럴의 값에는 아무런 영향을 주지 않으면서 읽기 편하게 해준다.
// 십진수 리터럴도 (정수,부동수수점) 세 자리씩 묶어주는 것이 좋다.
인터페이스는 타입을 정의하는 용도로만 사용해야 한다. 상수 공개용 수단으로 사용하지 말자.
'Prodo 독서 리뷰' 카테고리의 다른 글
[Effective Java] Item 24. 멤버 클래스는 되도록 static으로 만들라 (0) | 2021.04.12 |
---|---|
[Effective Java] Item 23. 태그 달린 클래스보다는 클래스 계층구조를 활용하라 (0) | 2021.04.12 |
[Effective Java] Item 21. 인터페이스는 구현하는 쪽을 생각해 설계하라 (0) | 2021.04.12 |
[Effective Java] Item 20. 추상 클래스보다는 인터페이스를 우선하라 (0) | 2021.04.12 |
[Effective Java] Item 19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라 (0) | 2021.04.12 |