一直试图建立一个我想保持或多或少静态的类,所以我可以按类别选择不同的元素: MyClass.CategoryOne.ELEMENTONE
我为实现这一目标而构建的是
public class ElementClass {
public static List<Element> elementList = new ArrayList<Element>();
public enum Animals {
DOG(new Dog()),
CAT(new Cat());
private Animal element;
private Animals (Animal element) {
this.element= element;
addToList(element);
}
public Animal getElement() {
return element;
}
}
public enum Plants {
TREE(new Tree());
BUSH(new Bush());
private Plant element;
private Plants (Plant element) {
this.element= element;
addToList(element);
}
public Plant getElement() {
return element;
}
}
public enum Buildings {
FENCE(new Fence()),
BRIDGE(new Bridge()),
private Building element;
private Buildings(Building element) {
this.entity = element;
addToList(element);
}
public Building getElement() {
return element;
}
}
private static void addToList(Element element) {
if (!elementList.contains(element)) {
elementList.add(element);
}
}
}
问题是它没有完全初始化(在代码中的某个时刻,植物枚举不会添加到列表中,而其余部分则被添加到列表中。)
我可以&#34;补丁&#34;使用:
private static ElementClass instance = new ElementClass ();
private ElementClass () {
ElementClass.Animals.values();
ElementClass.Plants.values();
ElementClass.Buildings.values();
}
public static ElementClass getInstance() {return instance;}
尽早调用实例,但我想知道..有没有办法在没有其他目标的情况下添加值调用?我想我的方法不是最好的,但我不知道其他方法允许我以这种方式访问每个元素(例如ElementClass.Animals.DOG)。
如果方法不是太糟糕,有没有办法在课程开始时浏览所有的枚举?或者在for循环中添加它的方法(我不知道getClass()。getFields()是否可以提供帮助,或者如果我可以将字段转换为枚举以获取值)。
答案 0 :(得分:0)
此代码存在一些问题。
我的建议是,从构造函数中删除addToList调用,并使用如下内容:
public static final List<Element> ELEMENT_LIST = createList();
private static List<Element> createList() {
List<Element> result = new ArrayList<>();
List<HasElement> enumValues = new ArrayList<>();
enumValues.addAll(Arrays.asList(Animal.values));
enumValues.addAll(Arrays.asList(Plant.values));
...
for (HasElement hasElement : enumValues) {
result.add(hasElement.getElement());
}
return Collections.unmodifiableList(result);
}
interface HasElement {
Element getElement();
}
public enum Animals implements HasElement {
DOG(new Dog()),
CAT(new Cat());
private Animal element;
private Animals (Animal element) {
this.element = element;
}
@Override
public Animal getElement() {
return element;
}
}
答案 1 :(得分:0)
如何一起跳过枚举并使用静态内部类?例如:
public final class ElementClass {
public static void main(String[] args) {
ElementClass.Animal.DOG.makeSound();
ElementClass.Animal.CAT.makeSound();
}
public static abstract class Animal {
public static Animal DOG = new Dog();
public static Animal CAT = new Cat();
public abstract void makeSound();
}
}
// NOTE: Put in separate file if it needs to be accessible outside package.
final class Dog extends ElementClass.Animal {
@Override
public void makeSound() {
System.out.println("WOOF!");
}
}
final class Cat extends ElementClass.Animal {
@Override
public void makeSound() {
System.out.println("MEOW!");
}
}
这也避免了具有静态集合和可公开访问的集合的两种反模式。
您没有指定任何给定类别的元素需要是可迭代的,因此我没有将其作为要求包含在内,只是您可以按照指定的方式处理它们。
答案 2 :(得分:0)
问题是类初始化推迟到第一次使用。
您可以以某种形式使用枚举类本身。
public class ElementClass {
public static List<Class<Enum<?>>> enumClasses() {
List<Class<Enum<?>>> clazzes = new ArrayList<>();
Collections.addAll(clazzes,
Animals.class, Plants.class, Buildings.class);
return clazzes;
}
手动添加每个类似乎是一个小小的开销。
然后:
for (Class<Enum<?>> clazz : ElementClass.enumClasses()) {
// Getting a single value:
Object dog = Enum.valueOf(clazz, "DOG");
// Getting all values:
Object[] all = clazz.getEnumConstants();
}