我知道,为了正确地遍历枚举,您应该执行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的原因。因此,请勿在此枚举本身的构造函数中引用枚举值。
顺便说一下,您使用的是哪个编译器没有标记编译时错误?