创建枚举时出错,每个值都指向一个字符串列表

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 是一个必须创建对象的链表(顾名思义)对于每个包含对其邻居的引用的元素。如果您需要在列表的中间(或开头)添加元素,或者如果您需要 QueueDequeue 功能,那么这是一个优势。

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

的回答