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

时间:2018-06-25 01:28:41

标签: java builder

以下文字摘自“有效Java”第2项:

  

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

请转到this link以获取全文。

我已经可以遵循“换句话说,..”之前的所有内容。有人可以解释一下newInstance如何中断编译时异常检查以及Builder模式如何解决该问题。

2 个答案:

答案 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模式不会。对不起,我的泳池英语,希望您能理解。