java - 创建每个值都指向字符串列表的枚举时出错

标签 java enums java-11

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 是一个链接列表(正如名称所示) )必须为每个包含对其邻居的引用的元素创建一个对象。如果您需要在列表的中间(或开头)添加元素,或者需要 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的回答

关于java - 创建每个值都指向字符串列表的枚举时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59015841/

相关文章:

wpf - 无法在 WPF 中找到静态引用的枚举类型

java - Tomcat 9 和 Java 11 上的 Soap Web 服务响应不同

java - Eclipse/RAD 运行菜单消失

java - JPanel 未出现在 JOptionPane 内

java - 通过 Java ME 使用手机集成摄像头捕获视频

c# - 枚举 EF 5.0 - 数据库优先

java - 覆盖全局 jackson 配置

java - 如何将所有特定的枚举加载到集合中? (例如进入列表)

java - Axis 1.4 问题(无法加载 [META-INF/services/org.apache.axis.EngineConfigurationFactor)

java - 用于 Arraylist 处理和调用不同方法的高效 Java 构造