以下文本来自"Effective Java",第2项:
Java 中传统的抽象工厂实现是
Class
对象,其中newInstance
方法扮演 构建方法。这种用法充满了问题。ThenewInstance
方法总是尝试调用类的无参数 构造函数,甚至可能不存在。您没有编译时 如果类没有可访问的无参数构造函数,则出错。 相反,客户端代码必须处理InstantiationException
或IllegalAccessException
运行时,这既丑陋又不方便。 此外,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,然后得到一个"损坏的对象"。但生成器模式不会。对不起我的游泳池英语,希望你能理解。