2013-10-30 25 views
19

ben şöyle bir enum 'sınıf' Example denilen vardır:yuvalama gruplama ve alt gruplamalar hiyerarşisi ile enum/nasıl kullanılır

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; 
} 

Benim proje için önemlidir Birlikte çalıştığım tüm çeteleler bu yana (Example aittir onlar bir sınıfın kurucusunda bir argümandır).

nasıl aşağıdaki elde etmek için yuva/enum hiyerarşi kullanıyoruz:

  • bir enum Örneğin Grup A, B veya C olup Example.enumA1.isGroupBelonging(Group.A) veya isGroupBelonging(Example.enumA1,Group.A) gibi bir test için bir yöntem Doğru olan bir kamu yöntemi olurdu.

  • Aynı şeyi A, B ve C gruplarının alt grupları ile de yapabilirsiniz. Örneğin, A grubu, a, b ve c alt gruplarına sahip olabilir. Daha sonra public boolean olan Example.enumA1.isSubGroupBelonging(SubGroup.a) gibi bir şey yapan bir yöntem istiyorum.

  • Kodumu tıkayan bazı ayrıntılı enum adlarına ihtiyaç duymadan tüm bunları yapmanın bir yolu. Örneğin,

cevap

39

Ben tekabül ilişkilendiren çok basit enum yapıcısı kullanmak o Example.enumA1(Group.A,SubGroup.a) veya Example.enumA1.Group.A.SubGroup.a gibi bir şey kullanarak başvurmak zorunda kalmadan sadece benim diğer sınıfların boyunca Example.enumA1 başvurmak edebilmek için iyi olurdu enum değeri ile grubu:

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; 
    } 
} 

Kullanımı:

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

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

alt grupları yapmak için bir yapabilirsiniz Örnek olarak Grup için benzer bir yapı türü, bir kurucu olarak Group(SubGroup ... subgroups) ve alt grupları içeren bir EnumSet<SubGroup>.

+2

Mükemmel bir çözüm! Mevcut grubu almak için 'getGroup()' yöntemini de eklerim. – Shahar

+0

Çok zarif bir çözüm :-) teşekkürler! – Gilbou

23

ayrı bir Enum sınıf yaratmadan grup çeşitli çeteleler için EnumSet kullanabilirsiniz:

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"); 
    } 
} 
+3

Ayrıca [burada] görüldüğü gibi (http://jaxenter.com/enumset-in-java-regularenumset-vs-jumboenumset-106051.html) – ccDict

+2

EnumSet'de garantili bir sipariş var mı? örneğin ENUM_A3, ENUM_A1, ENUM_A2 sırasına göre groupA için enumlar istiyorum. EnumSet'in bana garanti vereceğinden emin değilim. – Ewoks

+2

EnumSet, siparişin garantisi değildir, ancak 'Collections.sort'u (yeni ArrayList (Example.groupA)) kullanabilirsiniz. 'sipariş etmek için! – Wendel