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

标签 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);
    }
}

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

但是,在 super() 构造函数中有一个 try-catch block ,在异常调用的情况下 quit() 方法并抛出异常。在这种情况下,我在 quit() 方法中获得的 nodeId 未初始化(具有 null 值)。

有什么办法可以避免吗

@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()

这是两个问题合二为一:

  1. 构造函数除了将给定参数存储在 (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

    “不应做任何工作” 我的意思是构造函数不应根据参数计算任何属性值或调用依赖项或非公共(public)方法来进行检查。

    <
  2. constructors 不应直接或间接调用除 private 和/或 final 方法(在类中)以外的任何其他方法(即,您不得调用 final 方法,后者又会调用非 final 方法)。


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

您在父类(super class)构造函数中所做的一切很可能应该在一个单独的类中完成,并且只有该过程的结果才应该传递给您的类(及其父类(super class))。

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

关于java - 标记为@NotNull 的最终字段未初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42719270/

相关文章:

java - 在带有字符串长度方法的 "or"语句中使用 "if"语句

java - 有没有其他方法可以在 JPanel 上绘图?

Java GPA数组扫描仪输入和计算

java - Selenium - 单击链接打开一个新选项卡

python - Selenium PhantomJS 抛出 EelementNotVisible,而 Firefox 在组合框选择期间完全正常

c# - 通过 Options 类或 DesiredCapability 禁用 IE 弹出窗口拦截器

java - TextView if 语句不起作用

javascript - 如何将 yield (generators) 与 selenium webdriver promises 一起使用?

Python Selenium 滚动到底部 Google Photos 相册

java - 客户端如何获取IDL?