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()方法也属于一个不同的类.