Effective Java - Item 22
Updated:
Effective Java
Item 22. 인터페이스는 타입을 정의하는 용도로만 사용하라
Interface의 용도
인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입의 역할을 한다.
public class item22_ex {
public interface A{
public void B();
}
public static class AA implements A{
@Override
public void B() {
System.out.println("hi");
}
}
public static void main(String[] args) {
A a = new AA(); // 클래스 AA의 타입으로 interface A가 사용되었다.
a.B();
}
}
달리말해, 클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에 얘기해주는 것이다.
인터페이스는 오직 이 용도로만 사용해야 한다
상수 인터페이스 안티패턴
상수 interface란 메서드 없이 상수인 static final 필드로 만 가득찬 인스턴스이다.
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_MASS = 9.109_383_56e-31;
}
이는 인터페이스를 잘못 사용한 예이다. 이를 사용하여 야기되는 문제점은,
- 외부 인터페이스가아닌 내부구현에 해당하며 이는 내부구현을 클래스의 API로 노출하는 행위이다.
- 클라이언트 코드가 상수들에 종속
- 이후 릴리즈시에도 호환성을 위해 여전히 상수 인터페이스를 구현하고 있어야 한다.
상수를 공개하는 법
- 연관된 클래스나 인터페이스에서 공개 : Integer.MAX_VALUE, Double.MIN_VALUE
- Enum
- 인스턴스화할 수 없는 유틸리티 클래스
public class PhysicalConstants { private PhysicalConstants() { } // 인스턴스화 방지 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; }
결론
인터페이스는 타입을 정의하는 용도로만 사용해야한다.
상수 공개용 수단으로 사용하지 말자.
출처
Joshua Bloch. Effective Java 3/E. n.p.: 인사이트, 2018년 11월 1일.