创建对象然后将其传递给参数vs将对象声明为类的构造函数中的参数之间有什么区别。喜欢1)和2)之间的区别是什么?
1)
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(isr);
2)
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
答案 0 :(得分:2)
我想到了两个不同之处:
在理论中,使用一体化结构,如果外部构造函数抛出一个异常,你就会有一个内部对象的实例,你永远不会调用{ {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()
。
使用一体化构造,您假设外部对象将在您关闭它时关闭传递它的对象(因为,再次,您没有引用要使用的内部对象关闭它)。这对于isr.close()
来说是正确的,但可能并非普遍适用。通过确保BufferedReader
被调用,再次尝试资源有助于实现。
如果您正在处理不需要close
或类似的对象,那么两者之间没有太大区别。在调试时单步执行单步操作比在一体化结构中更容易,但除此之外,其中没有太多内容。