Java抱怨在交换机的默认情况下未初始化最终字段

时间:2013-04-09 09:09:25

标签: java

我想以不同的方式初始化最终字段。因此,我创建了一个枚举类型并对其进行切换。

    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
    }
}

4 个答案:

答案 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