私達はブラウザのユーザエージェントのような一定したひもを単に表すか、または前にとして公共の静的で最終的なひもを使用するのに使用するべきであるか。
enumとして公共の静的な最終を使用して多くの問題を、のような持っている:

  • -タイプがちょうどintであるのでないtypesafeあなたが特定の種類が渡す要求される、または2つのタイプをことができる(意味を成していない)他のどのintの価値でも一緒に加える。 これは無関係な場所で使用される奇妙な定数を見つける今までのところでは働くようであるCプログラムで単に特に顕著ので必須の一定した、提供された一定した分け前同じintの価値である。
  • namespace無し-ひもと他のintのenumのタイプとの衝突を避けるためにintのenumの定数の前に付けなければならない。
  • もろさ-そのようなenumsがコンパイル時定数であるので、それらを使用する顧客に編集される。 新しい定数が2つの既存の定数の間で加えられるかまたは順序が変われば、顧客はリコンパイルされなければならない。 そうでなければ、まだ走る、彼らの行動は未定義である。
  • 印刷された価値はuninformativeであるかもしれない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と私は私が知られていたユーザエージェントを期待しているときタイプ安全(人々はがらくたを渡すことができない)および報知的なタイプを得る。 他のどの利点もか単純な方法を同じを達成する見るか。