티스토리 뷰
728x90
반응형
인터페이스는 타입을 정의하는 용도로만 사용하라
- 인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 았는 타입 역할을 합니다. 달리 말해, 클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에게 말해주는 것입니다. 인터페이스는 오직 이 용도로만 사용해야 합니다.
인터페이스의 잘못된 예
🧨 예제 코드
- 인터페이스에는 메서드뿐만 아니라 상수도 작성할 수 있기 때문에 메서드 없이 상수만 선언하는 상수 인터페이스를 만들 수 있습니다.
public interface PhysicalConstants {
static final double AVOGADROS_NUMBER = 6.022_140_857e23;
static final double BOLTZMAN_CONSTANT = 1.380_648_52e-23;
static final double ELECTRON_MASS = 9.109_383_56e-31;
}
💡 좋지 않은 이유
- 클래스 내부에서 사용하는 상수는 내부 구현에 해당됩니다.
- 상수 인터페이스를 구현하는 것은 내부 구현을 외부로 노출하는 행위입니다.
- 클래스가 어떤 상수 인터페이스를 사용하든 사용자에게는 아무런 의미가 없습니다. 오히려 혼란만 줍니다.
- 버전이 바뀌어 상수들을 사용하지 않게 되더라도 바이너리 호환성을 위해 여전히 상수 인터페이스를 구현하고 있어야 합니다.
💡 바이너리 호환성이란?
- 프로젝트내의 무엇인가를 바꾼 이후에도 기존 바이너리가 아무런 문제없이 실행될 수 있는 상황
- 바이너리 호환성이란? >> 이동
💡 더 나은 방법
- 상수를 공개할 목적으로 인터페이스를 사용한다면 더 좋은 방법이 있습니다.
- Enum을 사용해서 나타내기 적합하다면 Enum으로 대체합니다.
- 유틸리티 클래스를 만들어 대체합니다.
// Enum을 사용하기
public enum PhysicalConstantsEnum {
AVOGADROS_NUMBER(6.022_140_857e23),
BOLTZMAN_CONSTANT(6.022_140_857e23),
ELECTRON_MASS(6.022_140_857e23);
@Getter
private double val;
PhysicalConstantsEnum(double val) {
this.val = val;
}
}
// 유틸리티 클래스 사용하기
public class PhysicalConstantsUtil {
// 인스턴스화 방지
private PhysicalConstantsUtil() {}
public static final double AVOGADROS_NUMBER = 6.022_140_857e23;
public static final double BOLTZMAN_CONSTANT = 1.380_648_52e-23;
public static final double ELECTRON_MASS = 9.109_383_56e-31;
}
728x90
반응형
'스터디 > 이펙티브 자바' 카테고리의 다른 글
이펙티브 자바 - Item24. 멤버 클래스는 되도록 static으로 만들라. (0) | 2022.07.16 |
---|---|
이펙티브 자바 - Item23. 태그 달린 클래스보다는 클래스 계층구조를 활용하라. (0) | 2022.07.16 |
이펙티브 자바 - Item21. 인터페이스는 구현하는 쪽을 생각해 설계하라. (0) | 2022.07.16 |
이펙티브 자바 - Item20. 추상 클래스보다는 인터페이스를 우선하라 (0) | 2022.07.15 |
이펙티브 자바 - Item19. 상속을 고려해 설계하고 문서화하라. 그렇지 않다면 상속을 금지하라. (0) | 2022.07.13 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- redis sorted set으로 대기열 구현
- pipeline architecture
- transactional outbox pattern
- spring boot excel download oom
- 트랜잭셔널 아웃박스 패턴 스프링 부트 예제
- java userThread와 DaemonThread
- spring boot redis 대기열 구현
- 서비스 기반 아키텍처
- spring boot redisson destributed lock
- transactional outbox pattern spring boot
- redis sorted set
- spring boot redisson sorted set
- redis 대기열 구현
- spring boot 엑셀 다운로드
- microkernel architecture
- pipe and filter architecture
- spring boot redisson 분산락 구현
- @ControllerAdvice
- spring boot poi excel download
- spring boot excel download paging
- 트랜잭셔널 아웃박스 패턴 스프링부트
- 자바 백엔드 개발자 추천 도서
- polling publisher spring boot
- 람다 표현식
- 공간 기반 아키텍처
- service based architecture
- JDK Dynamic Proxy와 CGLIB의 차이
- space based architecture
- java ThreadLocal
- 레이어드 아키텍처란
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함