///
Search
💡

item 22. 인터페이스는 타입을 정의하는 용도로만 사용하라 Use interfaces only to define types

상수 인터페이스?

인터페이스는 클래스가 해당 클래스로 무엇을 할 수 있는지 클라이언트에 설명해주는 역할을 한다. 이외의 용도로는 사용하면 안 된다.
오용한 예시 중, 상수 인터페이스 란 것이 있다. 메서드 없이 static final 메서드로만 차있는 인터페이스를 뜻한다.
// Constant interface antipattern - do not use! public interface PhysicalConstants { // Avogadro's number (1/mol) static final double AVOGADROS_NUMBER = 6.022_140_857e23; // Boltzmann constant (J/K) static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23; // Mass of the electron (kg) static final double ELECTRON_MASS = 9.109_383_56e-31; }
Java
복사
잘 못 사용한 인터페이스
클래스 내부에서만 활용하는 상수는, 외부 인터페이스가 아니라 내부 구현에 해당한다. 따라서 상수 인터페이스를 구현하는 것은 이 내부 구현을 클래스의 API로 노출하는 행위이다.

문제점

1.
해당 인터페이스를 활용하면 내부 구현이 해당 인터페이스에 종속되게 된다. 이후 릴리즈에서 이 상수들을 사용하지 않더라도, 호환성을 위해 계속 상수 인터페이스를 구현해야 한다.
2.
final이 아닌 클래스가 상수 인터페이스를 구현하면 하위 클래스의 네임스페이스가 해당 인터페이스롤 오염된다.

대안

대안으로서 클래스나 인터페이스 자체에 필요한 상수를 추가하는 방법이 있다. 상수가 enum으로 표현 가능하다면 그렇게 하는 것이 좋다.
혹은 인스턴스를 만들 수 없는 유틸리티 클래스를 만들어 공개하자.
// Constant utility class package com.effectivejava.science; public class PhysicalConstants { private PhysicalConstants() { } // Prevents instantiation public static final double AVOGADROS_NUMBER = 6.022_140_857e23; public static final double BOLTZMANN_CONST = 1.380_648_52e-23; public static final double ELECTRON_MASS = 9.109_383_56e-31; }
Java
복사