如何将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 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> 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> parent() { return parent; } public Set> 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> 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 extends HasChildren> p; Class parent = getDeclaringClass(); Class children; public Enum extends HasChildren> 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 } }
等等…