2010-04-14 2 views
2

Я хотел бы знать, возможно ли в Java вложить Enums.Как вложить Enum внутри значения Enum

Вот то, что я хотел бы быть в состоянии сделать:

имеет перечисления Видов, изготовленные из КПП и DOG Wich даст мне доступ к подразделам перечислений из имеющихся собак и кошек и пород. Например, я хотел бы проверить, есть ли CAT или DOG, и если животное является PERSAN CAT или PITBULL DOG. Породы CAT и DOG должны быть отличными перечислениями, то есть перечислением CatBreeds и перечислением DogBreeds.

Вот пример шаблона доступа я хотел бы использовать:

Породы:

  • Species.CAT
  • Species.DOG

Породы:

  • Виды.CAT.breeds.PERSAN
  • Species.DOG.breeds.PITBULL
+0

Чтобы быть более точным, я должен управлять другой тип пункта (это мой первый перечисление dimnension). Элемент получил некоторый атрибут и карту Detail. Второе измерение перечисления может использоваться для определения ключа карты «Детали» для определенного типа элемента. – Mathieu

ответ

3

не вы бы лучше делать это с наследованием? Cat и Dog будут подклассами видов. Persion будет подклассом Cat и Pitbull будет подклассом Dog.

Что вы хотите достичь, желая использовать Enums?

+0

У меня только 2 класса, и мне не нужны другие. Использование наследования слишком многословно и не позволяет использовать критерий выбора типа «тип» или «Выбор типа и подтипа». – Mathieu

+1

Существует] в конце вашей ссылки. Понять слово выбора как фильтрацию. – Mathieu

+0

Спасибо Матье. Исправленный комментарий: ну, если критерий выбора типа «тип» - это то, что я думаю, что это значит, тогда это может быть запах кода. См. Http://hanuska.blogspot.com/2006/08/swich-statement-code-smell-and.html –

-1
public enum A { 

    a1, 
    a2; 

    public enum B { 
     b1, 
     b2 
    } 
} 

и так далее ...

+2

Neat - это вложенное перечисление, и это может быть лучшее, что он получает. Однако это дает «Species.breeds.PERSAN» вместо «Species.CAT.breeds.PERSAN», который он хочет. –

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("----------------------"); 
    } 
} 
Смежные вопросы