Как вложить Enum в значение Enum - PullRequest
2 голосов
/ 14 апреля 2010

Я хотел бы знать, возможно ли в Java вкладывать Enums.

Вот что я хотел бы сделать:

Имейте перечисление Виды, сделанные из 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

Ответы [ 3 ]

3 голосов
/ 14 апреля 2010

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

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

0 голосов
/ 22 января 2012

один способ вложить перечисления:

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("----------------------");
    }
}
0 голосов
/ 14 апреля 2010
public enum A {

    a1, 
    a2;

    public enum B {
        b1, 
        b2
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...