카테고리 없음

이펙티브 자바 - 아이템 22 : 인터페이스는 타입을 정의하는 용도로만 사용하라

밍 끄적 2023. 5. 8. 16:39
728x90

인터페이스의 용도

클래스가 어떠한 인터페이스를 구현한다는 것은, 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에 얘기해주는 것이다.

위반 사례 : 상수 인터페이스

상수 인터페이스란, 메소드 없이, static final 필드로만, 즉 상수로만 구성된 인터페이스를 일컫는다.

아래는 상수 인터페이스의 예다.

public interface PhysicalConstancs {
	// 아보가드로 수
	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;
}

 

상수 인터페이스는 무엇을 할 수 있는지를 알려주는, 타입을 정의하는 용도가 아니므로 안티패턴이다.

상수 인터페이스의 구현은 외부 인터페이스가 아닌 내부 구현에 해당한다.

즉, 내부 구현을 외부로 노출하는 꼴이다. 이는 사용자에게 혼란을 주며 클라이언트 코드가 내부구현에 해당하는 상수에 종속적이게 될 수 있다.

상수 인터페이스 - 해결 방안

상수를 공개하고 싶다면, 상수 인터페이스가 아닌 아래의 방법을 사용하자.

  1. 특정 클래스나 인터페이스와 강하게 연관된 상수는, 그 클래스나 인터페이스 자체에 추가하자.
    • 연관된 곳에서만 공개하도록 하자.
    • ex ) 모든 숫자 Primitive Type의 Boxing 클래스
      • Integer와 Double 클래스의 MIN_VALUE, MAX_VALUE
  2. 인스턴스화를 막은 유틸리티 클래스에서 공개하자.
    • ex ) 아래는, 위 PhysicalConstants 상수 인터페이스를, 인스턴스화를 막은 유틸리티 클래스를 이용하도록 개선한 예다.
public class PhysicalContants {
	private PhysicalContants() {}

	// 아보가드로 수
	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_MASS = 9.109_383_56e-31;
}

 

728x90