반응형
[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;
}
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
}
public class Test {
double atoms(double mols) {
return AVOGADROS_NUMBER * mols;
}
...
// Many more uses of PhysicalConstants justify static import
}
결론, 인터페이스는 타입을 정의할 때만 사용해야 한다. 상수를 외부에 제공하기 위해 사용하면 안된다.
반응형
'backend > Java' 카테고리의 다른 글
[Java] Java Interface feature 변화의 history - 번역 (0) | 2019.07.17 |
---|---|
[Java] Java Iterator를 Java Stream 으로 변환하기 (1) | 2018.09.07 |
throw new UnsupportedOperationException() (4) | 2009.10.30 |
[Effective Java] 23. 새로 작성하는 코드에서는 원천(raw) 타입을 사용하지 말자. (0) | 2009.10.30 |
[Effective Java] 15. 가변성을 최소화하자. (2) | 2009.10.19 |
[Effective Java] 11. clone 메소드는 신중하게 오버라이드 하자. (2) | 2009.10.15 |
[Effective Java] 9. equals 메소드를 오버라이드 할 땐 hashCode 메소드도 항상 오버라이드 하자. (0) | 2009.09.28 |
[Effective Java] 8. equals 메소드를 오버라이딩 할 때는 보편적 계약을 따르자. (4) | 2009.09.24 |