아이템22. 인터페이스는 타입을 정의하는 용도로만 사용하라

wisdom·2022년 8월 18일
0

Effetctive Java

목록 보기
22/80
post-thumbnail

인터페이스는 자신을 구현할 클래스의 인스턴스를 참조할 수 있는 타입 역할을 한다.
인터페이스는 오직 이 용도로만 사용해야 한다.

✔️ 상수 인터페이스 - 잘못된 사용 예시

인터페이스를 타입을 정의하는 용도로 사용하지 않은 대표적인 예로 상수 인터페이스를 들 수 있다.

상수 인터페이스란, 메서드 없이 상수를 뜻하는 static final 필드로만 가득 찬 인터페이스를 말한다.

📍 상수 인터페이스 안티패턴

// 상수 인터페이스 안티패턴 - 사용금지!
public interface PhysicalConstants {
    // 아보가드로 수 (1/몰)
    static final double AVOGADROS_NUMBER   = 6.022_140_857e23;

    // 볼츠만 상수 (J/K)
    static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23;

    // 전자 질량 (kg)
    static final double ELECTRON_MASS      = 9.109_383_56e-31;
}
  • 위와 같은 상수 인터페이스 안티패턴은 인터페이스를 잘못 사용한 예다.

  • 상수 인터페이스를 구현하는 것은 이 내부 구현을 클래스의 API로 노출하는 행위다.

  • 상수를 공개할 목적이라면, 이 외에 적당한 선택지 2가지가 있다.

    • 열거 타입으로 나태내기 적합한 상수라면, 열거 타입으로 만들어 공개한다.
    • 인스턴스화할 수 없는 유틸리티 클래스에 담아 공개한다.

📍 상수 유틸리티 클래스

앞의 예제의 유틸리티 클래스 버전이다.

// 상수 유틸리티 클래스
public class PhysicalConstants {
  private PhysicalConstants() { }  // 인스턴스화 방지

  // 아보가드로 수 (1/몰)
  public static final double AVOGADROS_NUMBER = 6.022_140_857e23;

  // 볼츠만 상수 (J/K)
  public static final double BOLTZMANN_CONST  = 1.380_648_52e-23;

  // 전자 질량 (kg)
  public static final double ELECTRON_MASS    = 9.109_383_56e-31;
}

상수를 사용할 때는 정적 임포트(static import)를 통해 클래스 이름을 생략할 수 있다.

import static effectivejava.chapter4.item22.constantutilityclass.PhysicalConstants.*;

public class Test {
	double atoms(double mols) {
    		return AVOGADROS_NUMBER * mols;
	}
}



📌 핵심 정리

인터페이스는 타입을 정의하는 용도로만 사용해야 한다.
상수 공개용 수단으로 사용하지 말자.

profile
백엔드 개발자

0개의 댓글