EJ2E Item 19. 인터페이스는 오직 타입을 정의할 때만 사용하라
Java : 2009/01/28 12:38
참조: Effective Java 2nd Edition
어떤 클래스가 인터페이스를 구현할 때 인터페이스는 해당 클래스의 인스턴스를 참조할 수 있는 타입을 제공한다. 즉 해당 클래스 인스턴스를 가지고 고객이 무엇을 할 수 있는지 알려주는 것이다. 이 경우 이외에 다른 의도로 인터페이스를 사용하는 것은 부적절하다.
상수 인터페이스(constant interface) 안티 패턴
- 매서드 없이 상수를 표현한 static final 필드만 있다.
- 그 상수를 사용하는 클래스는 해당 인터페이스를 구현하여 상수 이름을 클래스 이름으로 구분해야 할 필요를 없앤다.(A.C B.C 대신에 A와 B가 구현하는 인터페이스 Z로 C를 올려서 Z.C 형태로 사용하게 하는 건가보네요.)
- 클래스가 내부에서 어떤 상수를 사용하는지는 구체적인 내용에 해당하는데 클래스가 상수 인터페이스를 구현하면 구체적인 내용을 밖으로 노출하게 된다.
- 차후에 해당 상수가 필요없어지더라도 바이너리 호환성을 위해 해당 인터페이스를 그대로 구현하고 있어야 한다.
- 자바 라이브러리 중에 java.io.ObjectStreamConstants는 예외다.
- 상수를 다룰 땐 해당 상수가 속하는 클래스나 인터페이스를 잘 고려해야 하며 열거형이 아닌지 보고 열거형일 경우에는 enum type 사용을 고려하라.
상수를 자주 사용할 때는 static import를 사용할 수도 있겠다.
인터페이스로는 타입을 정의해야지 상수를 표현하지 않아야 한다.
어떤 클래스가 인터페이스를 구현할 때 인터페이스는 해당 클래스의 인스턴스를 참조할 수 있는 타입을 제공한다. 즉 해당 클래스 인스턴스를 가지고 고객이 무엇을 할 수 있는지 알려주는 것이다. 이 경우 이외에 다른 의도로 인터페이스를 사용하는 것은 부적절하다.
상수 인터페이스(constant interface) 안티 패턴
- 매서드 없이 상수를 표현한 static final 필드만 있다.
- 그 상수를 사용하는 클래스는 해당 인터페이스를 구현하여 상수 이름을 클래스 이름으로 구분해야 할 필요를 없앤다.(A.C B.C 대신에 A와 B가 구현하는 인터페이스 Z로 C를 올려서 Z.C 형태로 사용하게 하는 건가보네요.)
- 클래스가 내부에서 어떤 상수를 사용하는지는 구체적인 내용에 해당하는데 클래스가 상수 인터페이스를 구현하면 구체적인 내용을 밖으로 노출하게 된다.
- 차후에 해당 상수가 필요없어지더라도 바이너리 호환성을 위해 해당 인터페이스를 그대로 구현하고 있어야 한다.
- 자바 라이브러리 중에 java.io.ObjectStreamConstants는 예외다.
- 상수를 다룰 땐 해당 상수가 속하는 클래스나 인터페이스를 잘 고려해야 하며 열거형이 아닌지 보고 열거형일 경우에는 enum type 사용을 고려하라.
상수를 자주 사용할 때는 static import를 사용할 수도 있겠다.
인터페이스로는 타입을 정의해야지 상수를 표현하지 않아야 한다.
'Java' 카테고리의 다른 글
| UrlRewriterFilter 소개 (0) | 2010/02/07 |
|---|---|
| 자바 System.out.println 콘솔 출력 가로채기 (6) | 2010/01/25 |
| 클래스파일 보기 (5) | 2009/07/20 |
| Double.MAX_VALUE는 좀 특이하군요 @_@ (4) | 2009/05/19 |
| EJ2E Item 20. 태그가 있는 클래스 대신 클래스 계층구조를 선호하라. (0) | 2009/03/13 |
| EJ2E Item 19. 인터페이스는 오직 타입을 정의할 때만 사용하라 (0) | 2009/01/28 |
| EJ2E Item 18. 추상 클래스 보다는 인터페이스를 선호하라 (5) | 2009/01/19 |
| EJ2E Item 17. 상속에 대한 설계와 문서화를 제대로 하지 않을 거면 아예 상속을 허용하지 말라. (0) | 2009/01/13 |
| EJ2E Item 16. 상속보다 컴포지션을 선호하라 (0) | 2008/12/28 |
| EJ2E Item 15. 변경을 최소화하라 (2) | 2008/12/23 |
| EJ2E 14. public 클래스에서는 접근 메소드를 사용하지 public 필드를 사용하지 마라. (0) | 2008/12/21 |





