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일.

Reference

https://jyami.tistory.com/84