2014-08-30 179 views
1

创建对象并将其传递给参数vs在类的构造函数中声明一个对象作为参数的区别是什么?像1)和2)有什么区别?在构造函数中传递对象

1)

InputStreamReader isr=new InputStreamReader(System.in); 
BufferedReader br=new BufferedReader(isr); 

2)

BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 

回答

2

两个差异浮现在脑海中:

  1. 理论,与所有功能于一身的建筑,如果外部构造函数抛出一个异常,你会有一个内部对象的实例你永远不会打电话给close(因为你没有提及它,你可以用它来做),所以它不会被关闭,直到最终确定(如果那样)。在实践中,我不认为BufferedReader的构造可以抛出一个异常,而是......

    这是什么部分Java的新try-with-resources statement旨在帮助:

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

    使用try与资源,你可以肯定,即使第二个构造函数抛出,第一个对象被正确关闭。

    注意,当您使用try-与资源与多个声明如上,close被称为在它们出现的相反顺序,通常是你想要什么(在这种情况下,br.close()之前被调用isr.close())。

  2. 通过一体化构造,您假设外部对象将关闭当您关闭它时传递它的对象(因为您再次没有提及用于关闭的内部对象它)。 BufferedReader的确如此,但可能并不普遍。通过确保调用close,再次尝试资源帮助。

如果你正在处理不需要close或类似物体,有没有两者都相差无几。在调试时单步执行单个语句比单步执行更容易,但除此之外,其中没有多少内容。