java – 没有初始化标记为@NotNull的final字段

前端之家收集整理的这篇文章主要介绍了java – 没有初始化标记为@NotNull的final字段前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有这个代码
public static class MyWebDriver extends RemoteWebDriver {
    @NotNull
    private final String nodeId;

    public MyRemoteWebDriver(@NotNull String nodeId) {
        super();
        this.nodeId = nodeId;
    }

    @Override
    public void quit() {
        System.out.println("deleting node: " + nodeId);
    }
}

并保证传递给构造函数的nodeId不为空.并且因为nodeId字段是final,我希望它可以在我的quit()方法中初始化.

但是,在super()构造函数中有一个try-catch块,在异常调用quit()方法的情况下会抛出异常.在这种情况下,我在我的quit()方法中得到的nodeId没有初始化(具有空值).

有什么办法可以避免吗?

@Override
public void quit() {
    if (nodeId != null) {
        System.out.println("deleting node: " + nodeId);
    }
}

这个?这看起来很愚蠢,因为nodeId被标记为@NotNull.

解决方法

But,in super() constructor there is a try-catch block which in case of exception calls quit()

这是两个问题:

>构造函数不应该执行任何工作,除非在(final)成员变量中存储给定的参数.

[编辑]

Does that mean classes should not validate their inputs? I know many people who would disagree with having all of their objects possibly invalid instead of never existing at all. – chris

“不应该做任何工作”我的意思是构造函数不应该从参数中计算任何属性值,也可以调用依赖关系或非公共方法进行检查.
>构造函数绝对不应该直接或间接地调用私有和/或最终方法(在类内),也就是说,你不能调用一个最终的方法,反过来调用一个非最终的方法).

你遇到这个问题的原因是违反单一责任模式和分离关切.

在超类构造函数中做什么应该最有可能在一个单独的类中完成,只有该过程的结果应该被传递到你的类(和它的超类)中.

这显然意味着quit()方法也属于一个不同的类.

猜你在找的Java相关文章