27

次のようにenum呼び出される「クラス」が1つあります。Example

enum Example {
//enums belonging to group A:
   enumA1,
   enumA2,
   enumA3,
//enums belonging to group B:
   enumB1,
   enumB2,
   enumB3,
//enums belonging to group C:
   enumC1,
   enumC2,
   enumC3;
}

私のプロジェクトにとって、私が使用するすべての列挙型が属していることは重要ですExample(これはクラスのコンストラクターの引数であるため)。

enum以下を達成するために階層/ネストを使用するにはどうすればよいですか。

  • がグループ A、B、または C のどれであるかをテストするメソッドenum。たとえば、Example.enumA1.isGroupBelonging(Group.A)またはのようなものisGroupBelonging(Example.enumA1,Group.A)は、true を返すパブリック メソッドになります。

  • Aグループ、 、Bのサブグループでも同じことができCます。たとえば、グループ A にはサブグループabおよびがあるとしcます。Example.enumA1.isSubGroupBelonging(SubGroup.a)次に、 which is aなどのことを行うメソッドが必要ですpublic boolean

  • enumコードを詰まらせる手の込んだ名前を付ける必要なく、これらすべてを行う方法。たとえば、またはExample.enumA1のようなものを使用して参照する必要なく、他のクラス全体で参照できると便利です。Example.enumA1(Group.A,SubGroup.a)Example.enumA1.Group.A.SubGroup.a

4

3 に答える 3

47

対応するグループを列挙値に関連付ける非常に単純な列挙型コンストラクターを使用します。

public enum Example {

    ENUM_A1 (Group.A),
    ENUM_A2 (Group.A),
    ENUM_A3 (Group.A),

    ENUM_B1 (Group.B),
    ENUM_B2 (Group.B),
    ENUM_B3 (Group.B),

    ENUM_C1 (Group.C),
    ENUM_C2 (Group.C),
    ENUM_C3 (Group.C);

    private Group group;

    Example(Group group) {
        this.group = group;
    }

    public boolean isInGroup(Group group) {
        return this.group == group;
    }

    public enum Group {
        A,
        B,
        C;
    }
}

使用法:

import static Example.*;
import Example.Group;
...

ENUM_A1.isInGroup(Group.A);  // true
ENUM_A1.isInGroup(Group.B);  // false

Group(SubGroup ... subgroups)サブグループを作成するには、コンストラクターとして使用しEnumSet<SubGroup>、サブグループを含めるために を使用して、例と同様に Group に対して同様の種類の構造を作成できます。

于 2013-10-30T11:29:05.013 に答える
35

別のクラスEnumSetを作成せずに、さまざまな列挙型をグループ化するために使用できます。Enum

public enum Example {

    ENUM_A1, ENUM_A2, ENUM_A3,
    ENUM_B1, ENUM_B2, ENUM_B3,
    ENUM_C1, ENUM_C2, ENUM_C3;

    public static EnumSet<Example> groupA = EnumSet.of(ENUM_A1, ENUM_A2, ENUM_A3);
    public static EnumSet<Example> groupB = EnumSet.of(ENUM_B1, ENUM_B2, ENUM_B3);
    public static EnumSet<Example> groupC = EnumSet.of(ENUM_C1, ENUM_C2, ENUM_C3);

}   

public static void main(String[] args){
    if(Example.groupA.contains(Example.ENUM_A1)){
       System.out.println("Group A contains ENUM A1");
    }
}
于 2014-12-03T13:18:04.753 に答える
2

小さな追加:

@ELEVATE と @Wendel からの両方の回答が気に入っています。そして、どのソリューションをいつ使用するかは、(いつものように) シナリオによって異なります。各エントリが単一のグループの一部である必要がある場合は、この単一のグループを追加する必要があるため、ELEVATE のソリューションを好みます。ただし、一部の列挙型のみをグループ化する必要がある場合、またはそれらが明確でない場合は、より柔軟な (ただしエラーが発生しやすい) ため、Wendel のソリューションを使用します。

于 2018-11-30T13:40:27.147 に答える