在构造函数中传递对象

时间:2014-08-30 08:58:08

标签: java object constructor arguments

创建对象然后将其传递给参数vs将对象声明为类的构造函数中的参数之间有什么区别。喜欢1)和2)之间的区别是什么?

1)

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

2)

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

1 个答案:

答案 0 :(得分:2)

我想到了两个不同之处:

  1. 理论中,使用一体化结构,如果外部构造函数抛出一个异常,你就会有一个内部对象的实例,你永远不会调用{ {1}} on(因为你没有可以用来做它的引用),所以在完成之前它不会被关闭(如果那么)。在实践中,我认为close的构造函数不能抛出异常,但是......

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

    BufferedReader

    使用try-with-resources,您可以确定即使第二个构造函数抛出,第一个对象也会正确关闭。

    请注意,当您使用带有多个声明的try-with-resources时,try ( InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(isr); ) { // do your stuff here } 会在它们出现的 reverse 顺序中调用,这通常正是您想要的(在这种情况下,close之前会调用br.close()

  2. 使用一体化构造,您假设外部对象将在您关闭它时关闭传递它的对象(因为,再次,您没有引用要使用的内部对象关闭它)。这对于isr.close()来说是正确的,但可能并非普遍适用。通过确保BufferedReader被调用,再次尝试资源有助于实现。

  3. 如果您正在处理不需要close或类似的对象,那么两者之间没有太大区别。在调试时单步执行单步操作比在一体化结构中更容易,但除此之外,其中没有太多内容。