Reference/Effective-Java

    [Effective-Java] Chapter6 #38. 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라

    💡핵심 정리 열거 타입 자체는 확장할 수 없다. 하지만 인터페이스와 그 인터페이스를 구현하는 기본 열거 타입을 함께 사용해 같은 효과를 낼 수 있다. 클라이언트는 해당 인터페이스 구현을 통해 자신만의 열거 타입(혹은 다른 타입)을 만들 수 있다. API가 (기본 열거 타입을 직접 명시하지 않고) 인터페이스 기반으로 작성되었다면, 기본 열거 타입의 인스턴스가 쓰이는 모든 곳을 새로 확장한 열거 타입의 인스턴스로 대체해 사용할 수 있다. → 한정적 와일드카드 타입(Item 31) 📌 타입 안전 열거 패턴(typesafe enum pattern)과 열거 패턴(enum pattern) // jdk 1.5 이전의 방식 public final class Direction { public static final Di..

    [Effective-Java] Chapter6 #37. ordinal 인덱싱 대신 EnumMap을 사용하라

    💡 배열의 인덱스를 얻기 위해 ordinal을 쓰는 것을 일반적으로 좋지 않으니, EnumMap을 사용하라. 📌 As-is 1. ordinal()을 배열 인덱스로 사용한 경우 class Plant { enum LifeCycle { ANNUAL, PERENNIAL, BIENNIAL } final String name; final LifeCycle lifeCycle; Plant(String name, LifeCycle lifeCycle) { this.name = name; this.lifeCycle = lifeCycle; } @Override public String toString() { return name; } } 정원에 심은 Plant들을 배열 하나로 관리하고, 이들을 LifeCycle(한해살이, 여..

    [Effective-Java] Chapter6 #36. 비트 필드 대신 EnumSet을 사용하라

    열거할 수 있는 타입을 한데 모아 집합 형태로 사용한다고 해도 비트 필드를 사용할 이유는 없다. 📌 As-is 열거 값들이 집합으로 사용되는 경우 비트 마스킹을 활용한 정수 열거 패턴을 사용하곤 했다. public class Text { public static final int BOLD = 1 eClass = e.getClass(); if (eClass != elementType && eClass.getSuperclass() != elementType) return false; return (elements & (1L

    [Effective-Java] Chapter6 #35. ordinal 메서드 대신 인스턴스 필드를 사용하라

    enum type 상수에 연결된 값은 ordinal 메서드로 얻지 말고, 인스턴스 필드에 저장하라 대부분 enum type 상수는 자연스럽게 인덱스(하나의 정수값)을 갖게 된다. 따라서 자바의 enum type은 ordinal 메서드를 제공해 인덱스를 반환해준다. 그러나 Enum API 문서에도 대부분 프로그래머가 ordinal 메서드를 쓸 일이 없다고 언급하고 있다. 이 메서드는 EnumSet과 EnumMap 같이 enum type 기반의 범용 자료구조에 쓸 목적으로 설계되었다. ordinal 메서드를 잘못 사용한 경우를 살펴보자. 다음은 합주단 종류를 연주자가 1명인 솔로(solo)부터 10명인 디텍트(dectet)까지 정의한 enum type이다. public enum Esemble { SOLO, ..