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时出错了。我对这种类型的Enum很陌生。有人能帮上忙吗?
发布于 2019-11-24 08:40:24
主要有3件事:
1. getFoodItems()和getHotels()应该是静态的。
这些方法需要现有的枚举存在,甚至不使用枚举中的任何内容。
2.不要将categories声明为静态属性。
您使用相同的categories对象(或对同一个对象的引用),因为它是静态的。删除前面的static关键字,使其成为一个成员属性。每个对象都应该有自己的列表,如果是static,这是不可能的。
3.在方法中创建列表并将其交给构造函数
使用两个参数调用构造函数:名称和列表,但构造函数只接受名称。在methand中创建categories对象,并将其返回给构造函数。
来自@Holger的3项额外改进(见注释)
4.在提交可变列表之前,三思而后行。
如果将可变列表传递给方法,则该方法可以更改列表,从而导致可能难以找到的错误。
5. name是完全过时的,因为它没有吸气器,而且它的价值无论如何与固有的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的答案
发布于 2019-11-24 08:32:10
如果构造函数是固定的,静态方法应该可以工作。如果项目列表很小,为什么不将其内联声明?
public static enum Test implements IsSerializable {
FOOD("FOOD", "Food item1", "Food item2"),
HOTEL("HOTEL", "Hotel 1", "Hotel 2");
private final String displayName;
private final List<String> categories;
Test(String displayName, String... categories) {
this.displayName = displayName;
this.categories = List.of(categories);
}
public String displayName() {
return displayName;
}
public List<String> getCategories() {
return categories;
}
}发布于 2019-11-24 08:33:26
核心问题是在静态中初始化的枚举,从这个上下文中您不能引用非静态项(字段、方法)。
而且,您在枚举构造器中没有这些列表的位置,只能接受name param。
例如,您可以尝试使用List.of("Food item1“、"Food item2")代替并添加新字段。
https://stackoverflow.com/questions/59015841
复制相似问题