peaches-book-study / effective-java

이펙티브 자바 3/E
0 stars 2 forks source link

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

Open Lainlnya opened 4 months ago

Lainlnya commented 4 months ago

Chapter : 4. 클래스와 인터페이스

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

Assignee : Lainlnya


🍑 서론

🍑 본론

인터페이스의 역할

자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에 얘기해주는 것이며, 반드시 해당 용도로만 사용해야 한다.

지침에 맞지 않는 예

❎ 상수 인터페이스

메서드 없이, 상수를 뜻하는 static final 필드로만 가득 찬 인터페이스이며, 이 상수들을 사용하기 위해 클래스에서는 정규화된 이름을 쓰는 걸 피하고자 해당 인터페이스를 구현한다.

  public interface PhysicalConstants {
    // 아보가르드 수
    static final double AVOGADROS_NUMBER = 6.022_140_857e23;
    // 볼츠만 상수
    static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23;
  }

👆 상수 인터페이스 안티패턴으로 인터페이스를 잘못 사용한 예

public interface TestInterFace {
    static String NAME = "yerim";
}

public class InterfaceImpl implements TestInterFace {

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

// result : yerim

public class InterfaceImpl implements TestInterFace {
    public static final String NAME = "test";

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

// result : test

상수 공개 목적의 올바른 구현 방법

  1. 특정 클래스나 인터페이스와 강하게 연관된 상수라면 그 클래스나 인터페이스 자체에 추가 🐣 좋은 예시로 Integer.MIN_VALUE, Integer.MAX_VALUE

  2. 열거 타입으로 나타내기 적합한 상수라면 열거 타입으로 만들어서 공개

  3. 인스턴스화할 수 없는 유틸리티 클래스에 담아서 공개

package effectivejava. chapter4. item22. constantutilityclass; 
public class PhysicalConstants {
    private PhysicalConstants() { } // 인스턴스화방지
    // 아보가드로수(1/몰)
    public static final double AVOGADROS_NUMBER = 6.022_140_85723;
     // 볼츠만상수(J/K)
    public static final double BOLTZMANN_CONST = 1.380_648_52-23;
}

🐣 이렇게 적으면 PhysicalConstants.AVOGADROS_NUMBER 이 가능하다.

✅ 빈번하게 사용한다면 정적 import 하여 클래스 이름을 생략할 수 있다.

import static effectivejava.chapter4.item22. constantutilityclass. Physical Constants.*;
public class Test {
    double atoms (double mols) {
        return AVOGADROS_NUMBER * mols;
    }
}

🍑 결론

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


Referenced by

-