我想以不同的方式初始化最终字段。因此,我创建了一个枚举类型并对其进行切换。
public enum TYPE {
A,
B,
}
我还在交换机中添加了一个默认大小写,用断言警告我的同事程序员,以防他们添加新的枚举常量和 忘了更新开关。
default:
assert false : "missing TYPE detected";
然而,Java检测到我的参数中的缺陷并抱怨空白字段可能尚未初始化。我应该如何处理这种情况?
public class SwitchExample
{
public enum TYPE {
A,
B,
}
private final int foo;
public SwitchExample(TYPE t)
{
switch (t) {
case A:
foo = 11;
break;
case B:
foo = 22;
break;
default:
assert false : "missing TYPE detected";
}
// The blank final field foo may not have been initialized
}
}
答案 0 :(得分:4)
您可以抛出assert false : "missing TYPE detected";
IllegalArgumentException("missing TYPE detected")
答案 1 :(得分:0)
当您重新分配foo参考
时foo = 11;
你不能宣布它为最终
private final int foo;
请参阅http://javarevisited.blogspot.fr/2011/12/final-variable-method-class-java.html
答案 2 :(得分:0)
您可以在default
之后将代码更改为以下内容:
assert (foo = 0) > 0 : "missing TYPE detected";
答案 3 :(得分:0)
如果使用final
关键字,则必须在switch语句中的所有情况下设置其值。要解决此问题,只需将foo
设置为您知道的值即表示发生了错误,例如-1