Class.newInstance 中断编译时异常检查



以下文本来自"Effective Java",第2项:

Java 中传统的抽象工厂实现是Class对象,其中newInstance方法扮演 构建方法。这种用法充满了问题。ThenewInstance方法总是尝试调用类的无参数 构造函数,甚至可能不存在。您没有编译时 如果类没有可访问的无参数构造函数,则出错。 相反,客户端代码必须处理InstantiationExceptionIllegalAccessException运行时,这既丑陋又不方便。 此外,newInstance方法传播由 无参数构造函数,即使newInstance缺少 相应的throws条款。换句话说,Class.newInstance中断 编译时异常检查。构建器界面,如上所示, 纠正了这些缺陷。

请转到此链接以获取全文。

我以前已经能够遵循一切,"换句话说.."。有人可以解释一下newInstance如何破坏编译时异常检查以及生成器模式如何修复它。

'newInstance' 不会像普通类方法那样提前(在编译时(知道会抛出哪些异常(因为代码依赖项的构建方式,并且因为类必须知道它抛出哪些异常(。

Builder 模式使用一个类,该类接受请求(通常通过方法(并根据步骤(很可能在该类中定义(创建新的对象实例。

从概念上讲,非抽象工厂和构建器非常相似。

public class Main {
private int i;
public Main() throws IOException {
throw new IOException();
}
public static void main(String[] args) {
Class c = Main.class;
try {
c.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}

在我看来,如果我们使用class.newInstance()方法,我们将永远不会知道构造会抛出确切的异常,即使异常是检查异常并且检查异常未显示在方法签名处。就像上面的例子一样。如果我们使用class.newInstance(),我们将忘记处理IOException,然后得到一个"损坏的对象"。但生成器模式不会。对不起我的游泳池英语,希望你能理解。

最新更新