2012-07-30 125 views
0

我想创建一个场景,其中由enum class A中的枚举常量具有关联的子enum class Benum class C包含它们自己的常量。 enum class Benum class C中的常量从enum class D组常量的子集。下面是一个基本上就是我想实现:Java枚举协会

enum A { 
    CONST_1 ("const_1", B), // B is the associated enum 
    CONST_2 ("const_2", C); // C in the associated enum 

    private final String strVal; 
    private final Enum associatedEnum; 

    private A (String strVal, Enum associatedEnum) { 
     this.strVal = strVal; 
     this.associatedEnum = associatedEnum; 
    } 

    public Enum getAssociatedEnum() { 
     return this.associatedEnum; 
    } 

    public String toString() { 
     return this.strVal; 
    }  

    // Associated Enum contained subset of grouped constants 
    enum B { 
     CONST_3 (D.CONST_7.toString()), 
     CONST_4 (D.CONST_8.toString()); 

     private final String strVal; 

     private B (String strVal) { 
      this.strVal = strVal; 
     } 

     public String toString() { 
      return this.strVal; 
     }  
    } 

    // Associated Enum contained subset of grouped constants 
    enum C { 
     CONST_5 (D.CONST_9.toString()), 
     CONST_6 (D.CONST_10.toString()); 

     private final String strVal; 

     private C (String strVal) { 
      this.strVal = strVal; 
     } 

     public String toString() { 
      return this.strVal; 
     }    
    } 
} 

// Separate Enum containing all ungrouped constants 
enum D { 
    CONST_7 ("const_7"), 
    CONST_8 ("const_8"); 
    CONST_9 ("const_9"), 
    CONST_10 ("const_10"); 

    private final String strVal; 

    private D (String strVal) { 
     this.strVal = strVal; 
    } 

    public String toString() { 
     return this.strVal; 
    }  
} 

显然,这句法不起作用开箱即用的,因为你无法通过Java中的类这种方式。但任何人都可以提出一种我可以实现这一目标的方法吗?

我希望能用它来验证客户端应用程序中的静态结构化分组。

+0

http://stackoverflow.com/questions/221892/java-extendable-enumeration?rq=1 – 2012-07-30 23:23:47

回答

3

这应该有希望做你想做的。我已经列出了一个示例用法,它将列出子枚举类型值。

package a.b.c; 


public class EnumsTest { 

    public enum A { 
    A1(B.class), 
    A2(C.class); 

    private final Class<? extends Enum<?>> enumClazz; 

    A(final Class<? extends Enum<?>> enumClazz ) { 
     this.enumClazz = enumClazz; 
    } 

    public Enum<?>[] getSubEnumConstants() { 
     return enumClazz.getEnumConstants(); 
    } 

    /** 
    * @param value 
    * @return Never null 
    * @throws IllegalArgumentException To be consistent with Enum.valueOf() 
    */ 
    public <T> Enum<?> valueOfSubEnum(final String value) throws IllegalArgumentException { 
    for(Enum<?> enumInstance : getSubEnumConstants()) { 
     if(enumInstance.name().equals(value)) { 
     return enumInstance; 
     } 
    } 
    throw new IllegalArgumentException("valueOf for " + enumClazz.getName() + " could not be resoled with the value of " + value); 
    } 

    } 

    public enum B { 
    B1, 
    B2; 
    } 

    public enum C { 
    C1, 
    C2; 
    } 

    public static void main(String[] args) { 

    for(A a : A.values()) { 
     for(Enum<?> enumInstance : a.getSubEnumConstants()) { 
     System.out.println(a.name() + ":" + enumInstance.name()); 
     } 
    } 
    Enum<?> valueOfSubEnum = A.A1.valueOfSubEnum("B2"); 
    System.out.println(valueOfSubEnum.name()); 
    } 
} 

注意:如果要将子类型锁定到特定集合,可以让它们实现一个接口。

+0

忘了补充..这是输出... A1:B1 A1:B2 A2:C1 A2:C2 – Roadkillnz 2012-07-30 23:59:09

+0

这与我正在尝试做的非常接近...最终我希望能够变化一个子Enum中的值如下所示:A.A1.getEnumClazz()。valueOf(“B1”)。然而'.valueOf()'方法是不可访问的,即使它扩展了枚举 ......有没有办法解决这个问题? – travega 2012-07-31 02:36:34

+0

我已经更新了一个具有粗略值的例子,就像方法一样。你可能想看看Enum.valueOf()方法,以确保它的行为一致。 – Roadkillnz 2012-07-31 04:06:17

0

您不能用构造函数private B (String strVal, Enum associatedEnum)声明enum A。你可以声明其他枚举枚举,但不是这样。

+0

嘿谢谢我真的知道这一点。所以对我能*做什么的建议? – travega 2012-07-30 23:42:54

+0

为每个枚举创建一个单独的文件..然后你像这样配置: – 2012-07-31 00:59:37

+0

问题:你需要创建一个树形结构吗?就是它 ? – 2012-07-31 01:06:49

0

这对我的作品,但我可能会错过你想达到什么目的:

public enum A { 

    A1(B.B1), 
    A2(C.C2); 

    private final Enum<?> e; 

    private A(Enum<?> e) { 
    this.e = e; 
    } 

    static enum B { 
    B1, 
    B2; 
    } 

    static enum C { 
    C1(D.D1.getId()), 
    C2(D.D2.getId()); 

    private String id; 

    private C(String id) { 
     this.id = id; 
    } 

    } 

} 
enum D { 
    D1("abc"), 
    D2("def"); 

    private final String id; 

    private D(String id) { 
    this.id = id; 
    } 

    public String getId() { 
    return id; 
    } 

} 
+1

如果我正确理解人的问题,他们在类型之后,而不是类型中的特定实例。如果这是我的要求,我已经做了类似于你的事情,但是要返回类型 – Roadkillnz 2012-07-31 00:06:22

+0

了解的所有可用实例。感谢您的澄清! – Muel 2012-07-31 00:13:03