現在、プロジェクトの列挙型はコンストラクターでプロパティを取ります。列挙型ごとに完全に異なることが実際に保証されています。
ここで、単純なブール値であるプロパティを追加したいと思います。これは、ごく少数の特定のケースでのみデフォルトとは異なるものです。
ここに私が見ることができる2つの賢明なアプローチがあります:
コンストラクタをリファクタリングしてブールパラメータを取得し、特定の必要なパラメータに対してtrueに設定します。これは現在の状態で最もconsistentの1つですが、デフォルトとは非常にまれであるため、imhoに不要な混乱をかなり追加します。
デフォルトを使用するオーバーライド可能なゲッターメソッドを定義し、メソッドが変化する列挙型でメソッドをオーバーライドします。コンストラクターを "クリーン"に保つのでこれが好きですが、特に後の実装では見落とされたり忘れられたりする可能性がある "マジック"が導入され始めます-特に実装が隠されているためです。
純粋に実装の明確さから判断すると、オプション#1が圧倒的に優れているはずです。しかし、私の腸は、この場合littleのビットをさらに読みやすくするためにクラリティを犠牲にすることができるかどうかはわかりません。
あなたのニーズとブール値の実際の意味に応じて、私の頭に浮かぶいくつかの他のオプションがあります:
SPECIAL
としましょうおよびNON_SPECIAL
(より適切な名前を見つけてください)。これにより、少なくともパラメーターリストに不可解なブール値が含まれなくなります。また、IDEを使用すると、SPECIAL
の使用法を検索して、「特別な」値をすばやく見つけることができます。もちろん、これにより、さらに「不要な混乱」が追加されます。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
の値(= Set
s)を追加することもできます。