gpt4 book ai didi

java - 什么时候定义枚举值?

转载 作者:搜寻专家 更新时间:2023-10-30 21:07:25 25 4
gpt4 key购买 nike

我正在尝试以半高效的方式实现某些事情。在我的程序中,我有一个枚举器代表用于在程序中传递信息的指标。

我有一个类可以让我将这些指标“组合”到一个对象中,这样我就可以创建一个“句子”来提供复杂的信息,而无需对信息进行任何复杂的解析。它们本质上是位标志,但由于我使用的是枚举,所以我可以拥有的不仅仅是 64 个。

问题是,如果我经常实例化这个容器类的实例,我会像这样创建一个数组:

metrics = new boolean[Metrics.values().length];

我觉得经常创建一个枚举值数组只是为了请求它的大小是一种浪费。我想知道是否可以只在静态上下文中定义枚举值 () 的大小,这样它就是一个常数值,我不必重新计算:

private static final int METRIC_COUNT = Metrics.values().length;

我可以这样做吗?还是编译器在声明这个静态变量之前没有定义枚举值?我知道这不是对我的问题的最佳解释,但我不确定还能怎么说。

我知道静态变量将在运行时确定(除非分配给它的值是字面值),那么程序是否能够在此时执行时请求 Metrics 枚举的成员?

最佳答案

枚举集

"compose" these metrics into a single object

essentially bit flags

听起来您需要一个位数组,并针对每个预定义枚举值的存在/不存在进行一些翻转。

如果是这样,则无需自己动手。使用 EnumSetEnumMap .这些是 Set 的特殊实现和 Map 接口(interface)。这些类非常高效,因为它们处理枚举的本性、占用很少的内存并且执行速度非常快。

以内置 DayOfWeek 为例枚举。定义七个对象,每个对象对应 ISO 8601 日历中的每一天。

Set< DayOfWeek > weekend = EnumSet.of( DayOfWeek.SATURDAY , DayOfWeek.SUNDAY ) ;

使用 Set 的便捷方法,例如 contains

boolean isTodayWeekend = weekend.contains( LocalDate.now().getDayOfWeek() ) ;

如果您循环集合的元素,它们将按照它们在枚举中定义的顺序(它们的“自然”顺序)提供。因此,从逻辑上讲,EnumSet 应该被标记为 SortedSet ,但神秘地没有那么明显。不过,您知道顺序。例如,循环 EnumSet.allOf( DayOfWeek.class ) 首先呈现 DayOfWeek.MONDAY,最后呈现 DayOfWeek.SUNDAY(根据 ISO 8601 标准).

When Are Enum Values Defined?

enum 的元素是在编译时定义的,并且不能在运行时修改(除非你使用反射技巧)。加载类时,每个命名变量都会填充一个实例。参见 Section 8.9, Enum TypesJava Language Specification .

如果你用 DOGCATBIRD 定义一个枚举 Pet,那么你知道你会在运行期间始终只有三个实例。

您至少可以通过两种方式计算枚举中定义的元素的数量:

  • 调用编译器为任何 enum 生成的 values 方法,您可以在其中询问结果数组的大小,如您在问题中所示。
    int countDows = DayOfWeek.values().length() ;
  • 调用 Set::size在创建所有枚举实例的 EnumSet 之后。
    int countDows = EnumSet.allOf( DayOfWeek.class ).size() ;

关于java - 什么时候定义枚举值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54877109/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com