Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 운영체제
- 자료구조
- 딥러닝
- 논문
- 논문리뷰
- 이펙티브자바
- 프로그래머스
- 알고리즘
- Spring Batch
- 장애물인식
- Database
- 포인트클라우드
- 네트워크
- JPA
- 디자인패턴
- 아두이노
- Hibernate
- 파이썬
- Java
- 자율주행
- DeepLearning
- cartograhper
- 배달로봇
- 자바
- 자바ORM표준JPA프로그래밍
- MySQL
- 영속성컨텍스트
- Python
- Jetson
- persistance context
Archives
- Today
- Total
제리 devlog
[이펙티브자바] 인터페이스는 타입을 정의하는 용도로만 사용하라 본문
인터페이스 : 클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에게 전달하는 것이다. 인터페이스는 오직 이 용도로만 사용해야한다.
인터페이스를 잘못 사용한 예 )상수 인터 페이스
상수 인터페이스란 메서드 없이 static final 필드로만 가득한 인터페이스를 말한다. 클래스에 정규화된 이름을 쓰는걸 피하고자 종종 사용한다고함
public interface PhysicalConstants {
//아보가도르 수(1/몰)
static final double AVOGADROS_NUMBER = 6.002_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;
}
클라이언트는 상수 인터페이스의 값에 직접 접근할 수 있음
인터페이스에서 protected도 불가!!
protected static final double AVOGADROS_NUMBER = 6.002_140_857e23;
-> 불필요한 정보를 노출하는 행위 오히려 클라이언트가 혼란할 수 있음
클라이언트는 상수 인터페이스의 값으로 새로운 로직을 만들 수 있음
-> 다음 릴리스때 인터페이스의 값이 바뀐다면 클라이언트 어플리케이션에 문제발생
public class Calculator implements PhysicalConstants{
public double cal1(int input){
return input * AVOGADROS_NUMBER;
}
public double cal2(int input){
return input * BOLTZMANN_CONSTANT;
}
public double cal3(int input){
return input * ELECTRON_MASS;
}
}
public static void main(String[] args) {
Calculator calculator = new Calculator();
double myResult = 100 * calculator.AVOGADROS_NUMBER; //문제 발생
}
대안
상수 유틸리티 클래스를 제공
public class PhysicalConstants {
//인스턴스화 방지
private PhysicalConstants(){};
//아보가도르 수(1/몰)
protected static final double AVOGADROS_NUMBER = 6.002_140_857e23;
//볼츠만 상수 (J/K)
static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23;
// 전자 질량 (kg)
public static final double ELECTRON_MASS = 9.109_383_56e-31;
}
public class Calculator{
public double cal1(int input){
return input * PhysicalConstants.AVOGADROS_NUMBER;
}
public double cal2(int input){
return input * PhysicalConstants.BOLTZMANN_CONSTANT;
}
public double cal3(int input){
return input * PhysicalConstants.ELECTRON_MASS;
}
}
enum 활용
public enum PhysicalConstants {
AVOGADROS_NUMBER(6.002_140_857e23), //아보가도르 수(1/몰)
BOLTZMANN_CONSTANT(1.380_648_52e-23), //볼츠만 상수 (J/K)
ELECTRON_MASS(9.109_383_56e-31); // 전자 질량 (kg)
private double value;
PhysicalConstants(double value) {
this.value = value;
}
public double getValue(){
return value;
}
}
public class Calculator{
public double cal1(int input){
return input * PhysicalConstants.AVOGADROS_NUMBER.getValue();
}
public double cal2(int input){
return input * PhysicalConstants.BOLTZMANN_CONSTANT.getValue();
}
public double cal3(int input){
return input * PhysicalConstants.ELECTRON_MASS.getValue();
}
}
결론
인터페이스는 타입을 정의하는 용도로만 사용해야 한다. 상수 공개용 수단으로 사용하지는 말자.
'Java' 카테고리의 다른 글
[Java] 소켓 통신 (간단한 채팅 프로그램 구현) (0) | 2021.04.19 |
---|---|
[이펙티브 자바] 맴버 클래스는 되도록 static으로 만들라 (0) | 2021.01.14 |
[이펙티브 자바] 추상 클래스보다는 인터페이스를 우선하라 (0) | 2021.01.04 |
[이펙티브자바] 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라 (0) | 2020.12.28 |
[이펙티브 자바] 상속보다는 컴포지션을 사용하라 (2) | 2020.12.06 |
Comments