작성자: 김대희
작성일: 2022년 5월 3일
- 클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인스턴스로 무엇을 할 수 있는지 클라이언트에게 얘기해주는 것.
- 인터페이스는 오직 이 용도로만 사용해야한다.
public interface PhysicalConstants {
static final double AVOGADROS_NUMBER = 6.022_140_857e23;
static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23;
static final double ELECTRON_MAXX = 9 .109_383_56e-31;
}- 이러한 상수 인터페이스 안티패턴은 인터페이스를 잘못 사용한 예이다.
- 클래스 내부에서 사용하는 상수는 외부 인터페이스가 아니라 내부 구현에 해당한다.
- 상수 인터페이스를 구현하는 것은 내부 구현을 API로 노출하는 행위.
- 클라이언트 코드가 이 상수(내부 구현)에 종속되게 한다.
- 호환성을 위해 내부 구현(상수)을 변경할 수 없게된다.
- final이 아닌 클래스가 상수 인터페이스를 구현한다면 모든 하위 클래스들의name space가 그 인터페이스가 정의한 상수들로 오염되어버린다.
- 더 합당한 선택지
-
특정 클래스나 인터페이스 자체에 추가해야한다.
- Integer, Double의 MIN_VALUE, MAX_VALUE 상수
-
유틸리티 클래스
public class PhysicalConstants { private PhysicalConstants() { } // 인스턴스화 방지 public static final double AVOGADROS_NUMBER = 6.022_140_857e23; public static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23; public static final double ELECTRON_MAXX = 9.109_383_56e-31; }
- PhysicalConstants.AVOGADROS_NUMBER 처럼 사용해야 하며, static import를 한다면 클래스 이름 없이 사용할 수 있다.
-