public enum Test implements IsSerializable {
FOOD("FOOD", getFoodItems()),//---Getting Error here
HOTEL("HOTEL", getHotels());//---Getting Error here
private String name;
static final List<String> categories = new LinkedList<String>();
Test(String name) {
this.name = name;
}
public List<String> getCategories() {
return this.categories;
}
private List<String> getFoodItems(){
categories.add("Food item1");
categories.add("Food item2");
return categories;
}
private List<String> getHotels(){
categories.add("Hotel 1");
categories.add("Hotel 2");
return categories;
}
}
我在创建此枚举时遇到错误。我是这种类型 Enum 的新手。任何人都可以帮助完成这项工作吗?
最佳答案
3个主要内容:
1。 getFoodItems()
和 getHotels()
应该是静态的。
这些方法需要现有枚举存在,甚至不使用枚举中的任何内容。
2。不要将categories
声明为静态属性..
您使用相同的categories
对象(或对同一对象的引用),因为它是静态的。删除前面的 static
关键字,使其成为成员属性。每个对象都应该有自己的列表,如果它是静态
,则这是不可能的。
3。在方法内创建 List 并将其交给构造函数
您可以使用 2 个参数调用构造函数:名称和 List,但构造函数只接受名称。在方法中创建 categories
对象并将其返回给构造函数。
@ Holger 的 3 项额外改进(见评论)
4。在分发对可变列表的引用之前请三思。
如果将可变列表传递给方法,该方法可以更改列表,这可能会导致难以发现的错误。
5。 name
已经完全过时了,因为它没有 getter,而且它的值无论如何都与内在的 name()
相匹配。
您可能想在任何情况下添加它,但枚举已经有一个返回枚举名称的方法name()
。
6。当您不需要它的特殊功能时,不要使用 LinkedList
(换句话说,永远不要使用它),而是使用 ArrayList
甚至更好,List.of(item1, item2)
,创建一个不可变列表。
ArrayList
通常比 LinkedList
性能更高,因为它基于数组,而 LinkedList
是一个链接列表(正如名称所示) )必须为每个包含对其邻居的引用的元素创建一个对象。如果您需要在列表的中间(或开头)添加元素,或者需要 Queue
或 Dequeue
功能,那么这是一个优势。
public enum Test implements IsSerializable {
FOOD("FOOD",getFoodItems()),//---Getting Error here.
HOTEL("HOTEL",getHotels());//---Getting Error here
private String name;
private final List<String> categories;
private Test(String name,List<String> categories) {
this.name = name;
this.categories=categories;
}
public List<String> getCategories() {
return this.categories;
}
private static List<String> getFoodItems(){
List<String> categories = new LinkedList<>();
categories.add("Food item1");
categories.add("Food item2");
return categories;
}
private static List<String> getHotels(){
List<String> categories = new ArrayList<>();
categories.add("Hotel 1");
categories.add("Hotel 2");
return categories;
}
}
[编辑] 另请注意boot-and-bottet的回答
关于java - 创建每个值都指向字符串列表的枚举时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59015841/