JAVA/Effective Java

클래스와 인터페이스 - 규칙 19 인터페이스는 자료형을 정의할 때만 사용하라.

반응형

인터페이스를 구현하는 클래스를 만들경우,

그 인터페이스는 해당 클래스의 객체를 참조할 수 있는 자료형 역할을 하게 된다. 

상수 인터페이스
=> 메서드가 없고 static final 필드만 있어, 상수 이름 앞에 클래스 이름을 붙이는 번거로움을 피하기 위해서이다.



1
2
3
public interface PhysicalConstants {
  static final double AVOGADROS_NUMBER = 6.02312312323;
}
cs




이런 상수 인터페이스 패턴은 인터페이스를 잘못 사용한 것이다.
=> 인터페이스는 사용자에게 이러한 기능을 구현한 클래스라는 명세를 알려주는거와 같은데 상수 인터페이스는 기능 명세를 제공하는 것이 아니라 상수값을 사용하기 위한 것으로 좋은 방식이 아니다.

또한 

추후에 이런 상수 인터페이스에 정의된 상수를 사용하지 않게 되더라도 하위호완성 때문에 제거를 하지 못하는 문제가 발생한다.

이런 상수들이 필요한 경우에는 상속이 불가능하고, 객체 생성이 불가능 하도록 private 생성자를 가지고 있는 유틸 클래스에 정의해서 사용하는 것이다.

만약 유틸리티 클래스에 정의된 상수 값을 자주 사용하게 된다면, 
JDK 1.5부터 도입된 정적 임포트(static import) 기능을 사용하여 클래스 이름을 제거하여 사용할 수 있다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Constant {
  private Constant() {}
  
  public static BABO = 2412.424;
}
 
 
 
import static com.wedul.wedulpos.Constant;
 
public Class WedulPosDto {
 double getData() {
  return BABO;
 }
}
cs



정리하면 인터페이스는 클래스의 명세로서 자료형을 정의할 때만 사용하고, 그 특정 목적을 벗어난 특정 상수와 같은 상수 인터페이스는 사용을 자제해야 한다.

출처 : 조슈아 블로크, 『 Effective Java 2/E』, 이병준 옮김, 인사이트(2014.9.1), 규칙19 인용.

반응형