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

weekbelt·2022년 11월 17일
0

상수를 정의하는 용도로 인터페이스를 사용하지 말 것!

package me.whiteship.chapter04.item22.constantinterface;

// 코드 22-1 상수 인터페이스 안티패턴 - 사용금지! (139쪽)
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;
}

위와 같이 인터페이스에 상수를 구현하면 아래와 같이 상수들을 아무런 네임스페이스없이 참조해서 쓸 수 있습니다.

package me.whiteship.chapter04.item22.constantinterface;

public class MyClass implements PhysicalConstants {

    public static void main(String[] args) {
        System.out.println(BOLTZMANN_CONSTANT);
    }

}

이렇게 네임스페이스를 없이 상수 BOLTZMANN_CONSTANT를 쓰고자 인터페이스에 상수를 선언해서 쓰는 것은 안티패턴이고 권장하지 않습니다. 그 이유는 인터페이스의 원래 의도를 오염시키기 때문입니다. 인터페이스의 목적은 타입을 정의하는 것 인데 MyClass는 PhycicalConstants타입인지 보면 인터페이스에 상수만 설정되있는 PhysicalConstants인터페이스와는 아무 관련이 없어보입니다. 또한 PhysicalConstants에 선언된 상수가 MyClass에서 그대로 쓰이기 때문에 인터페이스의 내부 구현을 참조하고 있으므로 캡슐화가 깨지게 됩니다. 따라서 상수를 선언하고 싶다면 인스턴스를 만들 수 없는 유틸리티성 클래스에 선언하는 방법이 있습니다.

package me.whiteship.chapter04.item22.constantutilityclass;

// 코드 22-2 상수 유틸리티 클래스 (140쪽)
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;
}

PhysicalConstants 클래스의 상수를 선언하고 이 클래스는 상수를 선언한 클래스이기 때문에 상속을 받지 않도록 기본 생성자를 private으로 설정해 인스턴스화를 방지합니다.

profile
백엔드 개발자 입니다

0개의 댓글