상수를 정의하는 용도로 인터페이스를 사용하지 말 것!
package me.whiteship.chapter04.item22.constantinterface;
// 코드 22-1 상수 인터페이스 안티패턴 - 사용금지! (139쪽)
public interface PhysicalConstants {
// 아보가드로 수 (1/몰)
static final double AVOGADROS_NUMBER = 6.022_140_857e23;
// 볼츠만 상수 (J/K)
static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23;
// 전자 질량 (kg)
static final double ELECTRON_MASS = 9.109_383_56e-31;
}
위와 같이 인터페이스에 상수를 구현하면 아래와 같이 상수들을 아무런 네임스페이스없이 참조해서 쓸 수 있습니다.
package me.whiteship.chapter04.item22.constantinterface;
public class MyClass implements PhysicalConstants {
public static void main(String[] args) {
System.out.println(BOLTZMANN_CONSTANT);
}
}
이렇게 네임스페이스를 없이 상수 BOLTZMANN_CONSTANT를 쓰고자 인터페이스에 상수를 선언해서 쓰는 것은 안티패턴이고 권장하지 않습니다. 그 이유는 인터페이스의 원래 의도를 오염시키기 때문입니다. 인터페이스의 목적은 타입을 정의하는 것 인데 MyClass는 PhycicalConstants타입인지 보면 인터페이스에 상수만 설정되있는 PhysicalConstants인터페이스와는 아무 관련이 없어보입니다. 또한 PhysicalConstants에 선언된 상수가 MyClass에서 그대로 쓰이기 때문에 인터페이스의 내부 구현을 참조하고 있으므로 캡슐화가 깨지게 됩니다. 따라서 상수를 선언하고 싶다면 인스턴스를 만들 수 없는 유틸리티성 클래스에 선언하는 방법이 있습니다.
package me.whiteship.chapter04.item22.constantutilityclass;
// 코드 22-2 상수 유틸리티 클래스 (140쪽)
public class PhysicalConstants {
private PhysicalConstants() { } // 인스턴스화 방지
// 아보가드로 수 (1/몰)
public static final double AVOGADROS_NUMBER = 6.022_140_857e23;
// 볼츠만 상수 (J/K)
public static final double BOLTZMANN_CONST = 1.380_648_52e-23;
// 전자 질량 (kg)
public static final double ELECTRON_MASS = 9.109_383_56e-31;
}
PhysicalConstants 클래스의 상수를 선언하고 이 클래스는 상수를 선언한 클래스이기 때문에 상속을 받지 않도록 기본 생성자를 private으로 설정해 인스턴스화를 방지합니다.
'개발관련 서적 정리 > Effective Java' 카테고리의 다른 글
아이템 24. 멤버 클래스는 되도록 static으로 만들라 (0) | 2023.02.05 |
---|---|
아이템 23. 태그 달린 클래스 보다는 클래스 계층 구조를 활용하라 (0) | 2023.02.05 |
아이템 20. 추상클래스보다 인터페이스를 우선하라 (0) | 2023.02.05 |
아이템 18. 상속보다는 컴포지션을 사용하라 (1) | 2023.02.05 |
아이템 17. 변경 가능성을 최소화 하라 (1) | 2023.02.05 |