java多枚举初始化
我一直在尝试建立一个类,我希望它或多或少保持静态,因此我可以按类别选择不同的元素,如下所示: 我的班级。类别。元素一
我为实现这一目标所做的是
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);
}
}
}
问题是它没有完全初始化(在代码中的某个点上,Plants枚举没有添加到列表中,而其余的则被添加到列表中)
我可以用以下方法“修补”它:
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()可以在这方面提供帮助,或者如果我可以将字段强制转换为enum以获取值)
# 1 楼答案
那么干脆跳过所有枚举并使用静态内部类呢?例如:
这还避免了两种反模式:静态集合和可公开访问的集合
您没有指定任何给定类别的元素都需要是可迭代的,因此我没有将其作为一项要求,只是您可以按照指定的方式处理它们
# 2 楼答案
这段代码有几个问题
我的建议是,从构造函数中删除addToList调用,并使用如下方法:
# 3 楼答案
问题是类初始化被推迟到第一次使用
您可以以某种形式使用枚举类本身
手动添加每个类似乎是一个很小的开销
然后: