创建枚举时出错,每个值都指向一个字符串列表
Getting error while creating an Enum with each value pointing to a list of String
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 的新手。谁能帮助完成这项工作?
如果构造函数是固定的,静态方法应该可以工作。如果项目列表很小,为什么不将它们声明为内联?
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;
}
}
核心问题是枚举在静态中初始化,并且从该上下文中您不能引用非静态项(字段、方法)。
此外,您的枚举中没有这些列表的位置 - 构造函数仅接受 name
参数。
例如,您可以尝试使用 List.of("Food item1", "Food item2") 并添加新字段。
3 个主要内容:
1。 getFoodItems()
和 getHotels()
应该是静态的。
这些方法需要现有的枚举存在,甚至不使用枚举中的任何东西。
2。不要将 categories
声明为静态属性..
您使用相同的 categories
对象(或对同一对象的引用),因为它是静态的。删除它前面的 static
关键字以使其成为成员属性。每个对象都应该有它自己的列表,如果它是 static
.
这是不可能的
3。在方法中创建列表并将其交给构造函数
您使用 2 个参数调用构造函数:名称和列表,但构造函数只接受名称。在 methand 中创建 categories
对象并将其 return 传递给构造函数。
@Holger 的 3 项额外改进(参见评论)
4。在分发对可变列表的引用之前请三思。
如果您将可变列表传递给某个方法,该方法可能会更改列表,从而导致可能难以发现的错误。
5。 name
完全过时了,因为它没有 getter,而且它的值无论如何都与内在的 name()
匹配。
你可能想在任何情况下添加它,但枚举已经有一个方法name()
,return是枚举的名称。
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
的回答
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 的新手。谁能帮助完成这项工作?
如果构造函数是固定的,静态方法应该可以工作。如果项目列表很小,为什么不将它们声明为内联?
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;
}
}
核心问题是枚举在静态中初始化,并且从该上下文中您不能引用非静态项(字段、方法)。
此外,您的枚举中没有这些列表的位置 - 构造函数仅接受 name
参数。
例如,您可以尝试使用 List.of("Food item1", "Food item2") 并添加新字段。
3 个主要内容:
1。 getFoodItems()
和 getHotels()
应该是静态的。
这些方法需要现有的枚举存在,甚至不使用枚举中的任何东西。
2。不要将 categories
声明为静态属性..
您使用相同的 categories
对象(或对同一对象的引用),因为它是静态的。删除它前面的 static
关键字以使其成为成员属性。每个对象都应该有它自己的列表,如果它是 static
.
3。在方法中创建列表并将其交给构造函数
您使用 2 个参数调用构造函数:名称和列表,但构造函数只接受名称。在 methand 中创建 categories
对象并将其 return 传递给构造函数。
@Holger 的 3 项额外改进(参见评论)
4。在分发对可变列表的引用之前请三思。
如果您将可变列表传递给某个方法,该方法可能会更改列表,从而导致可能难以发现的错误。
5。 name
完全过时了,因为它没有 getter,而且它的值无论如何都与内在的 name()
匹配。
你可能想在任何情况下添加它,但枚举已经有一个方法name()
,return是枚举的名称。
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
的回答