Java 在构造函数中传递对象

Java 在构造函数中传递对象,java,object,constructor,arguments,Java,Object,Constructor,Arguments,创建对象并将其传递给参数和在类的构造函数中将对象声明为参数之间的区别是什么。比如1)和2)之间的区别是什么 (一) (二) 我想到了两个不同点: 在理论中,对于一体式构造,如果外部构造函数抛出异常,您将有一个内部对象的实例,您永远不会调用close打开它(因为您没有可以用来执行此操作的对它的引用),因此它在完成之前不会关闭(如果有)。实际上,我认为BufferedReader的构造函数不能抛出异常,但是 这是Java的新功能的一部分,旨在帮助: try ( InputStreamRead

创建对象并将其传递给参数和在类的构造函数中将对象声明为参数之间的区别是什么。比如1)和2)之间的区别是什么

(一)

(二)


我想到了两个不同点:

  • 理论中,对于一体式构造,如果外部构造函数抛出异常,您将有一个内部对象的实例,您永远不会调用
    close
    打开它(因为您没有可以用来执行此操作的对它的引用),因此它在完成之前不会关闭(如果有)。实际上,我认为
    BufferedReader
    的构造函数不能抛出异常,但是

    这是Java的新功能的一部分,旨在帮助:

    try (
        InputStreamReader isr=new InputStreamReader(System.in);
        BufferedReader br=new BufferedReader(isr);
    )
    {
        // do your stuff here
    }
    
    使用try with resources,可以确保即使第二个构造函数抛出,第一个对象也会正确关闭

    请注意,当您将try with resources与上述多个声明一起使用时,
    close
    将按它们出现的相反顺序调用,这通常正是您想要的(在本例中,
    br.close()
    isr.close()
    之前调用)

  • 对于一体式构造,您假设外部对象将在您关闭它时关闭您传递给它的对象(因为,同样,您没有用于关闭它的内部对象的引用)。这适用于
    BufferedReader
    ,但可能并非普遍适用。再次尝试使用资源帮助,确保调用
    close

  • 如果您处理的对象不需要
    close
    或类似内容,那么两者之间没有太大区别。在调试时,单步跳过单独的语句比使用一体化结构更容易,但除此之外,没有太多内容

    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    
    try (
        InputStreamReader isr=new InputStreamReader(System.in);
        BufferedReader br=new BufferedReader(isr);
    )
    {
        // do your stuff here
    }