우리는 브라우저의 사용자 에이전트와 같은 일정한 끈을 대표하거나 단순히 전에로 공중 정체되는 마지막 끈을 이용하기 위하여 사용해야 하는가?
enum로 공중 정체되는 마지막을 사용하여 많은 문제가 있다:

  • - 유형이 다만 int이기 때문에 typesafe 아닙니다 당신이 특정한 유형이 통과하고 요구되는, 또는 2가지의 유형을 수 있는 (이해되지 않는) 다른 어떤 int 가치에서 합칠. 이것은 그럼에도 불구하고 작동하는 것을 보이는지 당신이 비관련 장소에서 사용되는 이상한 불변의 것을 찾아낼 C 프로그램에서 단순히 특히 두드러지다, 때문에 필수 일정하고 제공한 일정한 몫 동일한 int 가치.
  • namespace 없음 - 당신은 끈에 다른 int enum 유형을 가진 충돌을 피하기 위하여 int enum의 불변의 것에 접두사를 붙여야 한다.
  • 취성 - 그런 enums가 compile-time 불변의 것이기 때문에, 그(것)들을 사용하는 클라이언트로 집계된다. 새로운 불변의 것이 2개의 기존하는 불변의 것 사이에서 추가되거나 순서가 바뀌는 경우에, 클라이언트는 재컴파일되어야 한다. 그들이 이지 않는 경우에, 여전히 달릴 것이다, 그러나 그들의 행동은 확정되지 않을 것이다.
  • 인쇄한 가치는 정보가치가 없을 지도 모른다 당신이 1개를 전부 프린트하는 경우에 (공중 정체되는 마지막 int에서 것과 같이), 당신은 - enum로 int로-이다 대표하는 무슨, 또는 유형 인 무슨에 관하여 당신에게 아무것도 말하지 않는 수 얻는다. 자바 enums에서 당신은 가치와 함께 가득 차있는 유형 정보를 얻는다.

(아래에서 설명되는) Typesafe Enum 본을 사용해서 이 문제의 주위에 얻는 것이 가능하다, 그러나 이 본에는 그것의 자신의 문제가 있다: 그것은 확실히 말이 많다, 그러므로 오류 빈발 및 그것의 enum 불변의 것은 스위치 계산서에서 사용될 수 없다.

이것은 불변의 것을 대표하는 종류를 사용하여 typesafe enum 본의 보기, 이다:

//The typesafe enum 본
공중 종류 한 벌 {
    개인적인 마지막 끈 이름;
    공중 정체되는 마지막 한 벌은 = 새로운 한 벌 ("클럽") 때린다;
    공중 정체되는 마지막 한 벌 다이아몬드 = 새로운 한 벌 ("다이아몬드");
    공중 정체되는 마지막 한 벌 심혼 = 새로운 한 벌 ("심혼");
    공중 정체되는 마지막 한 벌 삽 = 새로운 한 벌 ("삽");    

    민간 소송 (끈 이름) {
        this.name =name;
    }
    toString 공중 끈 () {
        반환 이름;
    }
}

enums를 가진 동일한 보기는:

공중 enum 한 벌 {클럽, 다이아몬드, 심혼, 삽}

그것은 간단하다 아니다 그것이?

enum로 끈을 대표하기 위하여는, 나는 사용하고 있다:

공중 enum UserAgent {
        IE ("IE 사용자 에이전트"),
        FIREFOX ("Firefox 사용자 에이전트");

        userAgent 개인적인 마지막 끈;
        개인적인 UserAgent (userAgent 끈) {
            this.userAgent = userAgent;
        }
        toString 공중 끈 () {
            반환 userAgent;
        }
    }

이것은 확실히 더 간단하지 않다:

공중 정체되는 마지막 끈 IE = "IE 사용자 에이전트";
공중 정체되는 마지막 끈 FIREFOX = "Firefox 사용자 에이전트";

그러나 자바 enums로 나는 나가 알려지는 사용자 에이전트를 예상할 때 유형 안전 (사람들은 쓰레기를 약간 통과할 수 없다)와 유익한 유형을 얻는다. 당신은 동일을 달성하는 어떤 다른 이득 또는 간단한 방법을 보는가?