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

신명철·2022년 2월 18일
0

Effective Java

목록 보기
20/80

인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 한다.

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

이 지침에 맞지 않는 예로 상수 인터페이스가 있다.

// 상수 인터페이스
public interface PhysicalConstants{
      static final double AVOGARDROS_NUMBER = 6.022_140_857e23;
      static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23;
      static final double ELECTRON_MASS = 9.109_383_56e-3;
}

상수 인터페이스?
메서드 없이 상수를 뜻하는 static final 필드로만 가득 찬 인터페이스

이는 인터페이스를 잘못 사용한 예이다. 클래스 내부에서 사용하는 상수는 외부 인터페이스가 아니라 내부 구현에 해당하기 때문이다. 그렇기 때문에 내부 구현을 외부 API 로 노출하는 결과를 낳는다.

상수를 공개할 목적이라면 다음과 같은 선택지를 고려해야 한다.

  • 특정 클래스나 인터페이스와 강력하게 연관된 상수라면 그 클래스나 인터페이스 자체에 추가하라
  • 열거 타입으로 나타내기 적합한 상수라면 열거 타입으로 공개하라
    public enum Day{ 
    	MON, TUE, WED, THU, FRI, SAT, SUN
    }
  • 인스턴스화 할 수 있는 유틸리티 클래스로 공개하라
    public class PysicalConstants{
    		private PysicalConstants(){}; // 인스턴스화 방지
            public static final double AVOGARDROS_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-3;
      }
profile
내 머릿속 지우개

0개의 댓글