web-dev-qa-db-ja.com

Enumコンストラクター、オーバーライド可能なゲッター、またはその両方を組み合わせて使用​​していますか?

現在、プロジェクトの列挙型はコンストラクターでプロパティを取ります。列挙型ごとに完全に異なることが実際に保証されています。

ここで、単純なブール値であるプロパティを追加したいと思います。これは、ごく少数の特定のケースでのみデフォルトとは異なるものです。

ここに私が見ることができる2つの賢明なアプローチがあります:

  1. コンストラクタをリファクタリングしてブールパラメータを取得し、特定の必要なパラメータに対してtrueに設定します。これは現在の状態で最もconsistentの1つですが、デフォルトとは非常にまれであるため、imhoに不要な混乱をかなり追加します。

  2. デフォルトを使用するオーバーライド可能なゲッターメソッドを定義し、メソッドが変化する列挙型でメソッドをオーバーライドします。コンストラクターを "クリーン"に保つのでこれが好きですが、特に後の実装では見落とされたり忘れられたりする可能性がある "マジック"が導入され始めます-特に実装が隠されているためです。

純粋に実装の明確さから判断すると、オプション#1が圧倒的に優れているはずです。しかし、私の腸は、この場合littleのビットをさらに読みやすくするためにクラリティを犠牲にすることができるかどうかはわかりません。

2
Joe

あなたのニーズとブール値の実際の意味に応じて、私の頭に浮かぶいくつかの他のオプションがあります:

  1. コメントから質問まで -完全を期すために繰り返し): コンストラクターをオーバーライド =。ほとんどの列挙値はブール値のない値を使用し、特別な値はブール値のある値を使用します。これにより、列挙値の大部分が煩雑になるのを回避できますが、一部の要素には「神秘的なブール値」が追加されます。
  2. (1のバリアント、3と組み合わせ可能):ブールパラメータを追加する代わりに、2つの値を持つintroduce enumを導入します。SPECIALとしましょうおよびNON_SPECIAL(より適切な名前を見つけてください)。これにより、少なくともパラメーターリストに不可解なブール値が含まれなくなります。また、IDEを使用すると、SPECIALの使用法を検索して、「特別な」値をすばやく見つけることができます。もちろん、これにより、さらに「不要な混乱」が追加されます。
  3. たぶんブール値は、この列挙型が本当に2つの異なる列挙型である必要があることを教えてくれますか?
  4. Setの列挙値をstaticメンバーとして追加し、ゲッターで値がこのセットに含まれているかどうかを確認できます。

    enum MyEnum {
        VALUE1/*(...)*/,
        VALUE2/*(...)*/,
        // ...
        VALUE7/*(...)*/;
    
        // The Collections.unmodifiableSet(...) is optional but I like it to not
        // accidentally modify the set.
        private static Set<MyEnum> SPECIAL_VALUES =
                Collections.unmodifiableSet(EnumSet.of(VALUE2, VALUE7));
    
        // fields, constructor and other methods...
    
        public boolean isSpecial() {
            return SPECIAL_VALUES.contains(this);
        }
    }
    

    (私はあなたの名前がこれよりも良いと思いますか????)

    この方法では何も隠されていません。「特殊」の定義はまだ列挙型にあり、どの列挙値が「特殊」であるかをすばやく見つけることができます。 Setをpublicにして(またはstaticゲッターを提供して)、すべての「特別な」値に一度にすばやくアクセスできるようにすることもできます。

    明確さを失うことなく、booleanの値(= Sets)を追加することもできます。

1
siegi