2010-04-14 107 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("----------------------"); 
    } 
}