我知道,为了正确地遍历枚举,您应该执行

for (Days day : Days.values() {}

我在工作日和周末的枚举Days中创建了static数组。通过在构造函数中执行= new Days[] {SAT, SUN},用适当的Days值填充它们。当我遍历它们时,这些将按预期工作。

但是,当我为Days的所有值创建自己的静态数组时,我迷失了-以与以前完全相同的方式添加它们。遍历此数组后,令我惊讶的最后一个元素是null。无论Days枚举中有多少元素-我开始添加更多虚构的天数进行测试-结果是相同的。 “解决方案”是使它成为final。但是我想了解我做错了什么。

这告诉我在枚举构造函数中初始化数组是不好的。我的工作日/周末阵列会受到类似的影响吗?这实际上是一个很大的禁忌吗?枚举构造函数中不应该做哪些其他事情?或更确切地说,它应用于什么?除了做这样的事情

enum Days {
  MON("Monday");

  String fullname;

  private Days(String n) {fullname = n};
}


有人可以指出任何可以解释这一点的文档吗?我可能缺少一些有关Java枚举和/或其构造函数的明显的机长信息。

在寻找答案的过程中,我找到了static {}-就枚举此类静态数组而言,这是否是一种好习惯?还有其他选择吗?

编辑:由于要求确切的代码。

public enum Days {
  MON, TUE, WED, THU, FRI, SAT, SUN;

  public static Days[] weekdays;
  public static Days[] weekend;
  public static Days[] all;

  Days() {
    weekdays = new Days[] {MON, TUE, WED, THU, FRI};
    weekend = new Days[] {SAT, SUN};
    all = new Days[] {MON, TUE, WED, THU, FRI, SAT, SUN};
  }
}

String s = ""
for (Days d : Days.all) {
  s += d.toString(); //d is null once it reaches the last item
}

最佳答案

尝试:

public enum Days {
    MON, TUE, WED, THU, FRI, SAT, SUN;

    public static Days[] weekdays = {MON, TUE, WED, THU, FRI};
    public static Days[] weekend = {SAT, SUN};
    public static Days[] all = {MON, TUE, WED, THU, FRI, SAT, SUN};
}


您的代码未在我的Eclipse IDE中编译。您的代码尝试执行的操作是:


用7个实例MON, TUE, WED, THU, FRI, SAT, SUN定义一个枚举(这是第一行)。
创建任何Days实例后,您将使用特定的内容填充这三个静态数组(这是构造函数的工作)-这就是问题所在!当您隐瞒时第一个枚举实例(将成为MON),其他实例甚至还没有开始其生命周期,甚至MON尚未准备好(并且不能以该名称使用)。因此,数组会得到一些未定义/空的内容。
由于您的枚举包含7个值,因此每次有一个以上实例可用时,您都要进行7次数组初始化。最后一个实例是SUN的实例。然后,其他6个实例准备就绪,您将第七次覆盖阵列。这次仅缺少SUN,这就是为什么最后一个条目仍为null的原因。


因此,请勿在此枚举本身的构造函数中引用枚举值。

顺便说一下,您使用的是哪个编译器没有标记编译时错误?

10-08 16:24