-
Notifications
You must be signed in to change notification settings - Fork 2
Open
Labels
🐸 04 Classes & Interfaces4장 클래스와 인터페이스4장 클래스와 인터페이스
Description
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;
}👆 상수 인터페이스 안티패턴으로 인터페이스를 잘못 사용한 예
- 상수는 외부 인터페이스가 아니라 내부 구현에 해당 => 내부 구현을 클래스의 API로 노출하는 행위
- 해당 인터페이스를 사용하는 사용자에게는 아무런 의미가 없음
- 클라이언트 코드가 내부 구현에 해당하는 상수들에게 종속되게 만듦
- final이 아닌 클래스가 상수 인터페이스를 구현한다면 모든 하위 클래스의 이름 공간이 그 인터페이스가 정의한 상수들로 오염됨
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상수 공개 목적의 올바른 구현 방법
-
특정 클래스나 인터페이스와 강하게 연관된 상수라면 그 클래스나 인터페이스 자체에 추가
🐣 좋은 예시로 Integer.MIN_VALUE, Integer.MAX_VALUE -
열거 타입으로 나타내기 적합한 상수라면 열거 타입으로 만들어서 공개
-
인스턴스화할 수 없는 유틸리티 클래스에 담아서 공개
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
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
🐸 04 Classes & Interfaces4장 클래스와 인터페이스4장 클래스와 인터페이스