标记为@NotNull的最终字段未初始化

esi*_*n88 10 java selenium-webdriver

我有这个代码:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

有没有办法避免它除外

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

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

Tim*_*kle 4

\n

但是,在 super() 构造函数中有一个 try-catch 块,在出现异常时调用 quit()

\n
\n\n

这是两个问题合二为一:

\n\n
    \n
  1. 除了将给定参数存储在 ( ) 成员变量中之外,构造函数不应执行任何其他操作final

    \n\n

    [编辑]

    \n\n
    \n

    这是否意味着类不应验证其输入?我知道很多人不同意让他们的所有对象都可能无效而不是根本不存在。\xe2\x80\x93 克里斯

    \n
    \n\n

    我所说的“不应该做任何工作”是指构造函数不应该从参数计算任何属性值或调用依赖项或非公共方法来进行检查。

  2. \n
  3. 构造函数private永远不应该直接或间接地调用除and/or方法之外的任何其他方法final(在类内)(即,您不能调用一个final方法,而该方法又调用一个非final方法)。

  4. \n
\n\n
\n\n

你遇到这个问题的原因是违反了单一职责模式关注点分离

\n\n

您在超类构造函数中所做的任何事情很可能都应该在单独的类中完成,并且只有该过程的结果才应该传递到您的类(及其超类)中。

\n\n

这显然意味着该quit()方法也属于不同的类。

\n

  • “构造函数永远不应该调用非私有方法”构造函数永远不应该直接或间接调用非*final*方法。非私有性不是问题,而是方法被重写的可能性。 (4认同)