[Effective-Java] Chapter4 #22. 인터페이스는 타입을 정의하는 용도로만 사용하라

2023. 4. 30. 17:15·Reference/Effective-Java
💡 인터페이스는 타입을 정의하는 용도로만 사용하라. 상수 공개용 수단으로는 사용하지 말자.

 

📌 안티 패턴 - 상수 인터페이스
public interface PhysicalConstants {
    // 아보가드로 수
    static final double AVOGADROS_NUMBER = 6.022_140_857e23;
    // 볼츠만 상수
    static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23;
    // 전자 질량
    static final double ELECTRON_MASS = 9.109_383_56e-31;
}

메서드 없이, 상수를 뜻하는 static final field로만 가득 찬 인터페이스.

상수 인터페이스 안티패턴은 인터페이스를 잘못 사용한 예다.

 

클래스 내부에서 사용하는 상수는 외부 인터페이스가 아니라 내부 구현에 해당한다.

내부 구현을 클래스의 API로 노출하는 행위이자, 사용자에게 혼란과 오해의 소지를 줄 뿐이다.

더 심한 경우에는 클라이언트 코드가 내부 구현에 해당하는 이 상수들에 종속되어, 다음 릴리스에서 이 상수들을 더는 쓰지않게 되더라도 바이너리 호환성을 위해 여전히 상수 인터페이스를 구현하고 있어야 한다.

 

📌 (대안) 상수 유틸리티 클래스 / enum class

특정 클래스나 인터페이스와 강하게 연관된 상수라면, 그 클래스나 인터페이스 자체에 추가해야 한다.

대표적인 예로 Integer에 선언된 MIN_VALUE, MAX_VALUE 상수가 있다.

 

 1️⃣상수 유틸리티 클래스 (Item 4. 인스턴스화를 막으려거든 private 생성자를 사용하라)

public class PhysicalConstants {
    // 인스턴스화 방지
    private PhysicalConstants(){}

    static final double AVOGADROS_NUMBER = 6.022_140_857e23;
    static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23;
    static final double ELECTRON_MASS = 9.109_383_56e-31;
}

2️⃣ 열거 타입으로 공개

public enum PhysicalConstants {
    AVOGADROS_NUMBER(6.002_140_857e23),
    BOLTZMANN_CONSTANT(1.380_648_52e-23),
    ELECTRON_MASS(9.109_383_56e-31);

    private double value;

    PhysicalConstants(double value) {
        this.value = value;
    }

    public double getValue(){
        return value;
    }
}

 

저작자표시 비영리 (새창열림)
'Reference/Effective-Java' 카테고리의 다른 글
  • [Effective-Java] Chapter4 #24. 멤버 클래스는 되도록 static으로 만들라
  • [Effective-Java] Chapter4 #23. 태그 달린 클래스보다는 클래스 계층구조를 활용하라
  • [Effective-Java] Chapter4 #21. 인터페이스는 구현하는 쪽을 생각해 설계하라
  • [Effective-Java] Chapter4 #20. 추상 클래스보다는 인터페이스를 우선하라
나죽못고나강뿐
나죽못고나강뿐
싱클레어, 대부분의 사람들이 가는 길은 쉽고, 우리가 가는 길은 어려워요. 우리 함께 이 길을 가봅시다.
코드를 찢다싱클레어, 대부분의 사람들이 가는 길은 쉽고, 우리가 가는 길은 어려워요. 우리 함께 이 길을 가봅시다.
  • 나죽못고나강뿐
    코드를 찢다
    나죽못고나강뿐
  • 전체
    오늘
    어제
    • 분류 전체보기 (467)
      • Computer Science (60)
        • Git & Github (4)
        • Network (17)
        • Computer Structure & OS (13)
        • Software Engineering (5)
        • Database (9)
        • Security (5)
        • Concept (7)
      • Frontend (21)
        • React (13)
        • Android (4)
        • iOS (4)
      • Backend (81)
        • Spring Boot & JPA (52)
        • Django REST Framework (14)
        • MySQL (10)
        • Nginx (1)
        • FastAPI (4)
      • DevOps (24)
        • Docker & Kubernetes (11)
        • Naver Cloud Platform (1)
        • AWS (2)
        • Linux (6)
        • Jenkins (0)
        • GoCD (3)
      • Coding Test (112)
        • Solution (104)
        • Algorithm (7)
        • Data structure (0)
      • Reference (136)
        • Effective-Java (90)
        • Pragmatic Programmer (0)
        • CleanCode (11)
        • Clean Architecture (2)
        • Test-Driven Development (4)
        • Relational Data Modeling No.. (0)
        • Microservice Architecture (2)
        • 알고리즘 문제 해결 전략 (9)
        • Modern Java in Action (0)
        • Spring in Action (0)
        • DDD start (0)
        • Design Pattern (6)
        • 대규모 시스템 설계 (7)
        • JVM 밑바닥까지 파헤치기 (4)
        • The Pragmatic Programmer (1)
      • Service Planning (2)
      • Side Project (5)
      • AI (0)
      • MATLAB & Math Concept & Pro.. (1)
      • Review (20)
      • Interview (3)
      • IT News (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃
  • 공지사항

    • 한동안 포스팅은 어려울 것 같습니다. 🥲
    • N Tech Service 풀스택 신입 개발자가 되었습니다⋯
    • 취업 전 계획 재조정
    • 취업 전까지 공부 계획
    • 앞으로의 일정에 대하여..
  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
나죽못고나강뿐
[Effective-Java] Chapter4 #22. 인터페이스는 타입을 정의하는 용도로만 사용하라

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.