首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在创建Enum时获取错误,每个值指向字符串列表

在创建Enum时获取错误,每个值指向字符串列表
EN

Stack Overflow用户
提问于 2019-11-24 08:21:01
回答 3查看 60关注 0票数 2
代码语言:javascript
运行
复制
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很陌生。有人能帮上忙吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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)来创建一个不可变的列表。

一般来说,ArrayListLinkedList具有更高的性能,因为它是基于数组的,而LinkedList是一个链接列表(顾名思义),它必须为每个包含引用其邻居的元素创建一个对象。如果需要在列表的中间(或开始)添加元素,或者需要QueueDequeue功能,这是一个优势。

代码语言:javascript
运行
复制
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的答案

票数 2
EN

Stack Overflow用户

发布于 2019-11-24 08:32:10

如果构造函数是固定的,静态方法应该可以工作。如果项目列表很小,为什么不将其内联声明?

代码语言:javascript
运行
复制
    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;
        }
    }
票数 2
EN

Stack Overflow用户

发布于 2019-11-24 08:33:26

核心问题是在静态中初始化的枚举,从这个上下文中您不能引用非静态项(字段、方法)。

而且,您在枚举构造器中没有这些列表的位置,只能接受name param。

例如,您可以尝试使用List.of("Food item1“、"Food item2")代替并添加新字段。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59015841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档