정수 열거패턴: 타입 안전을 보장할 방법이 없고, 표현력도 좋지 못하다
열거타입 장점
열거 타입 상수 각각을 특정 데이터와 연결지으려면 생성자에서 데이터를 받아 인스턴스 필드에 저장하면 된다
필요한 원소를 컴파일타임에 다 알 수 있는 상수 집합이라면 항상 열거 타입을 사용하는게 좋다
ordinal 메서드: 해당 상수가 열거 타입에서 몇 번째 위치인지 반환
ordinal에 의존을 하게 된다면 해당 열거 타입에 변동이 생길 때 오작동이 발생할 수 있다
열거 타입 상수에 연결된 값은 ordinal 메서드로 얻지 말고 인스턴스 필드에 저장하는 것이 해결책
비트 필드 장점
비트별 연산을 사용해 합집합과 교집합 같은 집합 연산을 효율적으로 수행할 수 있다
비트필드 단점
정수열거의 단점이 그대로 나타난다
비트 필드 값이 그대로 출력되면 해석하기 어려움
비트 필드 하나에 녹아 있는 모든 원소를 순화하기도 까다롭다
최대 몇 비트가 필요한지 API 작성 시 미리 예측하여 적절한 타입을 선택해야 한다
EnumSet은 비트 필드 수준의 명료함과 성능을 제공한다
하지만 불변 EnumSet을 만들지 못한다는 단점이 있다
EnumMap의 장점
안전하지 않은 형변환을 사용하지 않는다
인덱스를 계산하는 과정에서 오류가 날 가능성도 원천 봉쇄
배열의 인덱스를 얻기 위해서 ordinal 대신 EnumMap을 사용해라
타입 안전 열거 패턴은 열거한 값들을 그대로 가져온 다음 값을 더 추가하여 다른 목적으로 쓸 수 있지만, 열거 타입은 그러지 못한다
인터페이스와 그 인터페이스를 구현하는 기본 열거 타입을 함께 사용해 확장의 효과를 낼 수 있다
해당 방법으로 클라이언트는 이 인터페이스를 구현해 자신만의 열거타입을 만들 수 있다
명명 패턴의 단점
애너테이션을 사용하면 코드 가독성을 높일 수 있으나 애너테이션을 선언하고 이를 처리하는 부분에서 코드 양이 늘어나며, 코드 처리가 복잡해저 오류가 날 가능성이 커진다
일반 프로그래머라면 애너테이션 타입을 직접 정의할 일은 거의 없지만 자바가 제공하는 애너테이션 타입들을 사용해야 한다
상위 타입의 메서드를 재정의 했음을 의미
구체 클래스에서 상위 클래스의 추상 메서드를 재정의할 때를 제외하고 재정의 하려는 모든 메서드에 @Override 애너테이션을 달아야 한다
마커 인터페이스: 아무 메서드도 담지 않고, 단지 자신을 구현하는 클래스가 특정 속성을 가짐을 표시해주는 인터페이스
마커 인터페이스 장점