JAVA/Effective Java
규칙19 인터페이스는 자료형을 정의할 때만 사용하라
소농배
2018. 12. 19. 20:31
![]() |
|
인터페이스를 구현하는 클래스를 만들게 되면, 그 인터페이스는 해당 클래스의 객체를 참조할 수 있는 자료형 역할을 하게 된다. 인터페이스를 클래스가 구현한다는 것은 클라이언트에게 클래스의 객체가 어떤일을 하게 될지 알려주는 것이다. 다른 목적으로 인터페이스를 정의하고 사용하는 것은 적절치 못하다.
이 기준에 미달하는 사례로는 상수 인터페이스 라는 것이 있다.
상수 인터페이스 : 메서드가 없고, static final 필드만 있는 인터페이스
상수 이름 앞에 클래스 이름을 붙이는 번거로움을 피하기 위해서 다음과 같은 인터페이스를 만든다.
//상수 인터페이스 안티 페턴!!!
public interface PhysicalConstants {
static final double AVOGADROS_NUBMER = 6.123123124;
static final double BOLTZMANN_CONSTANT = 1.123123123;
static final double ELECTRON_MASS = 9.123123123;
}
상수 인터페이스는 인터페이스를 잘못 사용한 예이다.
상수 정의를 인터페이스에 포함시키면 구현 세부사항이 클래스의 공개 API에 스며들게 된다.
//이렇게 스며 들게 된다.
public interface TestInterface {
static final double AVOGADORS_NUMBER = 1.123123123;
}
public class TestClass implements TestInterface {
}
TestClass tc = new TestClass();
double t = tc.AVOGADORS_NUMBER;
클래스가 상수 인터페이스를 구현한다는 사실은 클래스 사용자에게는 중요한 정보가 아니다.
상수 유틸리티 클래스를 만들어서 제공하는게 바람직하다.
public class PhysicalConstants {
private PhysicalConstants() { } //객체 생성을 막음
public static final double AVOGADROS_NUBMER = 6.123123124;
public static final double BOLTZMANN_CONSTANT = 1.123123123'
public static final double ELECTRON_MASS = 9.123123123;
}
인터페이스는 자료형을 정의할 때만 사용해야 한다. 특정 상수를 API의 일부로 공개할 목적으로는 적절치 않다.