如何将Enum嵌套在Enum的值中

我想知道Java中是否可以嵌套Enums。

在这里,我希望能够做到:

有一个enum由CAT和DOG组成的物种可以授予我访问可用CAT和DOG品种的子枚举的权限。 例如,我希望能够测试CAT或DOG,以及动物是PERSAN CAT还是PITBULL DOG。 CAT和DOG品种必须是不同的枚举,即CatBreeds枚举和DogBreeds枚举。

这是我想要使用的访问模式的示例:

物种:

  • Species.CAT
  • Species.DOG

品种:

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

你继续做这件事会不会更好? 猫和狗将是物种的子类。 Persion将成为Cat的子类,而Pitbull将成为Dog的子类。

想要使用Enums想要实现什么目标?

嵌套枚举的一种方法:

package nested2; import java.util.*; interface HasChildren { Set> children(); Class parent(); Enum p(); } enum Citrus implements HasChildren { lemon, lime, orange; Enum p; Class parent = getDeclaringClass(); Class children; public Enum p() { return p; } public Class parent() { return parent; } public Set> children() { return children != null ? EnumSet.allOf(children) : null; } enum Orange implements HasChildren { navel, valencia, blood; Enum p; Class parent = getDeclaringClass(); Class children; public Enum p() { return p; } public Class> parent() { return parent; } public Set> children() { return children != null ? EnumSet.allOf(children) : null; } enum Navel implements HasChildren { washinton, lateLane, caraCaraPink; Enum p; Class parent = getDeclaringClass(); Class children; public Enum p() { return p; } public Class parent() { return parent; } public Set> children() { return null; } } static { navel.children = Navel.class; for (Navel n : Navel.values()) np = orange; navel.p = navel; } enum Blood implements HasChildren { moro, taroco; Enum p; Class parent = getDeclaringClass(); Class children; public Enum p() { return p; } public Class parent() { return parent; } public Set> children() { return null; } } static { blood.children = Blood.class; for (Blood b : Blood.values()) bp = blood; blood.p = orange; } } static { for (Orange o : Orange.values()) op = 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  & HasChildren> Set 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("----------------------"); } } 
 public enum A { a1, a2; public enum B { b1, b2 } } 

等等…