1

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

    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

4 回答 4

4

而不是assert false : "missing TYPE detected";你可以抛出一个IllegalArgumentException("missing TYPE detected")

于 2013-04-09T09:13:34.203 回答
0

当您重新分配 foo 参考

foo = 11;

您不能将其声明为最终的

private final int foo;

http://javarevisited.blogspot.fr/2011/12/final-variable-method-class-java.html

于 2013-04-09T09:10:55.397 回答
0

您可以在您之后更改代码,default如下所示:

assert (foo = 0) > 0 : "missing TYPE detected";
于 2013-04-09T09:11:30.247 回答
0

如果使用final关键字,则必须在 switch 语句中的所有情况下设置其值。为了解决这个问题,只需将您设置foo为一个您知道意味着发生错误的值,例如-1

于 2013-04-09T09:14:42.460 回答