以下文字摘自“有效Java”第2项:
Java中传统的Abstract Factory实现是
Class
对象,其中newInstance
方法扮演了 构建方法。这种用法充满了问题。newInstance
方法总是尝试调用类的无参数 构造函数,甚至可能不存在。您没有编译时间 如果类没有可访问的无参数构造函数,则错误。 相反,客户端代码必须处理InstantiationException
或IllegalAccessException
在运行时很丑陋且不方便。 此外,newInstance
方法可传播由 即使newInstance
缺少 相应的throws
子句。换句话说,Class.newInstance
中断 编译时异常检查。上面显示的Builder界面, 纠正这些缺陷。
请转到this link以获取全文。
我已经可以遵循“换句话说,..”之前的所有内容。有人可以解释一下newInstance
如何中断编译时异常检查以及Builder模式如何解决该问题。
答案 0 :(得分:1)
'newInstance'不知道提前(在编译时)会抛出什么异常,就像普通的类方法那样(由于代码依赖关系的生成方式,并且因为类必须知道哪些异常)它会抛出)。
Builder模式使用一个接受请求的类(通常通过一种方法),并根据步骤(很可能在该类中定义)创建一个新的对象实例。
从概念上讲,这是一家非抽象工厂,与建筑商非常相似。
答案 1 :(得分:0)
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,然后得到一个“损坏的对象”。但是Builder模式不会。对不起,我的泳池英语,希望您能理解。