backend/Java

[Effective Java] 19. 타입을 정의할 때만 인터페이스를 사용하자.

버리야 2009. 10. 27. 19:46
반응형

[Effective Java] 19. 타입을 정의할 때만 인터페이스를 사용하자.
 

 // Constant interface antipattern - do not use!
public interface PhysicalConstants {
// Avogadro's number (1/mol)
static final double AVOGADROS_NUMBER = 6.02214199e23;
// Boltzmann constant (J/K)
static final double BOLTZMANN_CONSTANT = 1.3806503e-23;
// Mass of the electron (kg)
static final double ELECTRON_MASS = 9.10938188e-31;
}
 
상수 인터페이스 패턴은 인터페이스를 형편없이 사용한다. 향후 배포판에서 그 상수를 더 이상 사용할 필요가 없어서 클래스를 변경하더라도 바이너리 호환성을 유지하기 위해 여전히 그 상수 인터펭스를 구현해야 한다.
 
상수를 외부에 제공하고 싶을 때 적절한 방법

만일 어떤 상수가 기존 클래스나 인터페이스와 밀접하게 연관된다면, 그 상수를 해당 클래스나 인터페이스에 추가해야 한다.
예. Integer나 Double과 같은 모든 박스화 기본형 클래스에서는 MIN_VALUE와 MAX_VALUE 상수를 외부에 제공한다.
만일 상수가 열거타입(enumerated type)의 멤버가 되는 것이 가장 좋다면 enum타입으로 한다.
그렇지 않으면, 인스턴스를 생성할 수 없는 유틸리티 클래스에 상수를 두어야 한다.
 
//상수 유틸리티 클래스
package com.effectivejava.science;
public class PhysicalConstants {
private PhysicalConstants() { } // Prevents instantiation
public static final double AVOGADROS_NUMBER = 6.02214199e23;
public static final double BOLTZMANN_CONSTANT = 1.3806503e-23;
public static final double ELECTRON_MASS = 9.10938188e-31;
}
 
유틸리티 클래스의 경우, 클라이언트가 상수를 사용할 때 상수 명 앞에 그 유틸리티 클래스 명을 붙여야 한다. PhysicalConstants.BOLTZMANN_CONSTANT 와 같이.
만일 유틸리티 클래스의 상수를 무척 많이 사용한다면, static import문을 사용해서 상수 명 앞에 클래스 명을 붙이지 않게 하면 된다.
이렇게..
 
import static com.effectivejava.science.PhysicalConstants.*;
public class Test {
double atoms(double mols) {
return AVOGADROS_NUMBER * mols;
}
...
// Many more uses of PhysicalConstants justify static import
}
 
결론, 인터페이스는 타입을 정의할 때만 사용해야 한다. 상수를 외부에 제공하기 위해 사용하면 안된다.


반응형