代码之家  ›  专栏  ›  技术社区  ›  user1071840

newInstance中断编译时异常检查

  •  1
  • user1071840  · 技术社区  · 8 年前

    以下文本来自“有效Java”,第2项:

    传统的Java抽象工厂实现是 Class newInstance 方法扮演 构建方法。这种用法有很多问题。这个 新实例 构造函数,它甚至可能不存在。你没有编译时间 如果类没有可访问的无参数构造函数,则出错。 相反,客户端代码必须处理 InstantiationException 或 IllegalAccessException 在运行时,这是丑陋和不方便的。 而且 新实例 无参数构造函数,即使 缺少 相应的 throws Class.newInstance 打破 编译时异常检查。构建器界面,如上图所示, 纠正这些缺陷。

    this link 全文。

    新实例

    2 回复  |  直到 8 年前
        1
  •  1
  •   ryanwebjackson Matt    8 年前

    “newInstance”无法提前(在编译时)知道可以抛出哪些异常,就像普通的类方法一样(因为构建代码依赖关系的方式,并且因为类必须知道它抛出了哪些异常)。

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

        2
  •  0
  •   weaver    8 年前
    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() 方法,即使异常是检查异常且检查异常未显示在方法签名处,我们也永远不会知道构造将抛出确切的异常。就像上面的例子。如果我们使用 类。newInstance() ,我们将忘记处理IOException,然后得到一个“断开的对象”。但建设者模式不会。对不起我的游泳池英语,希望你能理解。