当前位置: 首页 > 面试题库 >

枚举values()。length与私有字段

易自珍
2023-03-14
问题内容

我有这样的枚举:

public enum Configuration {
    XML(1),
    XSLT(10),
    TXT(100),
    HTML(2),
    DB(20);

    private final int id;
    private Configuration(int id) {
        this.id = id;
    }
    public int getId() { return id; }
}

有时我需要检查枚举中有多少个字段。最好的解决方案是什么?我应该使用方法“ values()。length”吗?也许,我必须像这样在枚举中创建常量字段:

public enum Configuration {
    XML(1),
    XSLT(10),
    TXT(100),
    HTML(2),
    DB(20);

    private final int id;
    private Configuration(int id) {
        this.id = id;
    }
    public int getId() { return id; }

    public static final int Size = 5;
}

什么是最快,更优雅的解决方案?


问题答案:

values().length每次调用时,using
将创建该数组的新副本。有时我会创建自己的List(或设置或映射,无论需要什么)以避免这种无意义的复制。不过,我 不会对其进行
硬编码…如果您只需要大小,则可以使用:

private static final int size = Configuration.values().length;

在末尾。到评估时,所有值都将被初始化。这避免了其他答案中引起的DRY和不一致问题。

当然,这本身就是微优化的一部分……但是最终以 更简单的
代码IMO结束了。values().length从其他地方进行调用并不能表示您感兴趣的内容,而 只是 表示枚举的大小-
IMO通过一系列值来获得它的事实是偶然的并且会分散您的注意力。

使用的一种替代方法values()是将EnumSet.allOf().size()其用于小枚举将非常便宜-
但同样,它不像具有size字段那样可读。



 类似资料:
  • 问题内容: 在Java中,您可以创建一个枚举,如下所示: public enum Letter { A, B, C, D, E, F, G; } 这个问题涉及“ values()”方法。具体来说,如何实施?通常,我可以在Eclipse中使用F3或CTRL + Click跳到Java类的源代码(甚至对于String,Character,Integer甚至Enum之类的类)。可以查看其他枚举方法的源(

  • 问题内容: Java中的静态和非静态枚举有什么区别?两种用法是相同的。 正确吗 所有静态的都在启动时加载到内存中,非静态的则按需加载 ? 如果是,那么哪种方法更好?将某些数据始终保留在内存中还是每次使用服务器资源加载它们? 问题答案: 所有的都是有效的。如果您有嵌套的枚举,则它与相同。 所有类都是延迟加载的(枚举或其他),但是在加载时,它们会一次全部加载。也就是说,您不能加载一些常量,而不能加载其

  • 我试图使用流API代替循环,并有以下问题。 我有一个方法,它接受一个Enum并返回一个SortedMap。我将每个映射存储在一个列表中,但是我现在希望将每个SortedMap存储在一个映射中,Enum名称为键,从返回的SortedMap作为值,如何使用流API执行此操作? 当前工作列表方法 我使用收集器的错误尝试。toMap。。 工作回路,工作回路

  • 我试图在Avro模式中创建Union字段,并用它发送相应的JSON消息,但要有一个字段-。 https://avro.apache.org/docs/1.8.2/spec.html#工会 具有相应JSON数据的最简单联合类型(avro模式)的示例是什么?(尝试制作不含NULL/空数据的示例和含NULL/空数据的示例)。

  • 枚举是为了让程序可读性更好,比如用来描述用户的角色,普通的会员、付费的会员等,同时也限定了用户角色的种类,保证安全性,不会出现上帝角色这种乱入的东西。 枚举的类别与写法 默认值从0开始,依次递增,这个你应该还记得。 普通的枚举 let str = 'something' enum test{ test01, } enum FileAccess { None, Read