2010-04-14 55 views
2

我想知道在Java中嵌套枚举值是否可行。如何在Enum中嵌套枚举值

在这里,我想怎么能够做到:

取得了猫,狗至极的枚举物种会答应访问可用的猫犬品种的子枚举。例如,我希望能够测试CAT或DOG,以及动物是PERSAN CAT还是PITBULL DOG。 CAT和DOG品种必须是不同的枚举,即CatBreeds枚举和DogBreeds枚举。

这里是我想使用存取模式的示例:

种:

  • Species.CAT
  • Species.DOG

品种:

  • Species.CAT.breeds.PERSAN
  • Species.DOG.breeds.PITBULL
+0

为了更精确,我要管理不同类型的项目(这是我的第一枚举dimnension )。一个项目有一些属性和一个地图细节。可以使用第二枚举维度来定义给定类型的Item的地图关键字Detail avaibles。 – Mathieu 2010-04-14 11:39:47

回答

3

难道你会更好地继承这样做呢?猫和狗将是物种的子类。 Persion将是Cat的一个子类,而Pitbull将是Dog的一个子类。

想通过使用枚举来实现什么?

+0

我只有2班,不需要其他的。使用继承有点太冗长,并且阻止我使用基于“类型”的条件选择或“基于类型和子类型”的条件选择。 – Mathieu 2010-04-14 11:41:10

+1

有]在你的链接的末尾。理解选择词作为过滤。 – Mathieu 2010-04-14 12:39:05

+0

谢谢Mathieu。更正的评论:那么,如果“基于类型”的标准选择是我认为的意思,那么这可能是一种代码异味。见http://hanuska.blogspot.com/2006/08/swich-statement-code-smell-and.html – 2010-04-14 16:05:24

-1
public enum A { 

    a1, 
    a2; 

    public enum B { 
     b1, 
     b2 
    } 
} 

等等...

+2

整洁 - 它是一个嵌套枚举,它可能是他得到的最好的。但是,这给出了“Species.breeds.PERSAN”,而不是他想要的“Species.CAT.breeds.PERSAN”。 – 2010-04-14 12:07:29

0

单程窝枚举:

package nested2; 
import java.util.*; 
interface HasChildren { 
    Set<Enum<? extends HasChildren>> children(); 
    Class parent(); 
    Enum<? extends HasChildren> p(); 
} 
enum Citrus implements HasChildren { 
    lemon, lime, orange; 
    Enum<? extends HasChildren> p; 
    Class parent = getDeclaringClass(); 
    Class children; 
    public Enum<? extends HasChildren> p() { 
     return p; 
    } 
    public Class parent() { 
     return parent; 
    } 
    public Set<Enum<? extends HasChildren>> children() { 
     return children != null ? EnumSet.allOf(children) : null; 
    } 
    enum Orange implements HasChildren { 
     navel, valencia, blood; 
     Enum p; 
     Class parent = getDeclaringClass(); 
     Class children; 
     public Enum<? extends HasChildren> p() { 
      return p; 
     } 
     public Class<Enum<? extends HasChildren>> parent() { 
      return parent; 
     } 
     public Set<Enum<? extends HasChildren>> children() { 
      return children != null ? EnumSet.allOf(children) : null; 
     } 
     enum Navel implements HasChildren { 
      washinton, lateLane, caraCaraPink; 
      Enum<? extends HasChildren> p; 
      Class parent = getDeclaringClass(); 
      Class children; 
      public Enum<? extends HasChildren> p() { 
       return p; 
      } 
      public Class parent() { 
       return parent; 
      } 
      public Set<Enum<? extends HasChildren>> children() { 
       return null; 
      } 
     } 
     static { 
      navel.children = Navel.class; 
      for (Navel n : Navel.values()) 
       n.p = orange; 
      navel.p = navel; 
     } 
     enum Blood implements HasChildren { 
      moro, taroco; 
      Enum<? extends HasChildren> p; 
      Class parent = getDeclaringClass(); 
      Class children; 
      public Enum<? extends HasChildren> p() { 
       return p; 
      } 
      public Class parent() { 
       return parent; 
      } 
      public Set<Enum<? extends HasChildren>> children() { 
       return null; 
      } 
     } 
     static { 
      blood.children = Blood.class; 
      for (Blood b : Blood.values()) 
       b.p = blood; 
      blood.p = orange; 
     } 
    } 
    static { 
     for (Orange o : Orange.values()) 
      o.p = orange; 
     orange.children = Orange.class; 
    } 
} 
public class EnumTree { 
    static void visit(Class<?> clazz) { 
     Object[] enumConstants = clazz.getEnumConstants(); 
     if (enumConstants[0] instanceof HasChildren) for (Object o : enumConstants) 
      visit((HasChildren) o, clazz.getName()); 
    } 
    static void visit(HasChildren hasChildren, String prefix) { 
     if (hasChildren instanceof Enum) { 
      System.out.println(prefix + ' ' + hasChildren + " (" + hasChildren.parent() + ")" + " (" + hasChildren.p() 
        + " " + ((Enum) hasChildren).getDeclaringClass()); 
      if (hasChildren.children() != null) for (Object o : hasChildren.children()) 
       visit((HasChildren) o, prefix + ' ' + hasChildren); 
     } else 
      System.out.println("other " + hasChildren.getClass()); 
    } 
    static <E extends Enum<E> & HasChildren> Set<E> foo() { 
     return null; 
    } 
    public static void main(String[] args) { 
     //looks like p is the right parent 
     System.out.println(Citrus.Orange.Navel.washinton); 
     System.out.println(Citrus.Orange.Navel.washinton.getClass().getDeclaredClasses()); 
     System.out.println(Citrus.Orange.Navel.washinton.getClass().getEnclosingClass()); 
     System.out.println(Citrus.Orange.Navel.washinton.getClass().getDeclaringClass()); 
     visit(Citrus.lemon, ""); 
     System.out.println("----------------------"); 
     visit(Citrus.orange, ""); 
     System.out.println("----------------------"); 
     visit(Citrus.class); 
     System.out.println("----------------------"); 
    } 
}