2012-10-17 45 views
1

问题: 我有一个方法,实例化一个新的扫描仪类与BufferedReader,并返回扫描仪类本身。据我了解,Java将返回Scanner类 - 作为对象的“副本”(按值传递),而不是我们在C++中调用的参考或指针。假设逻辑是正确的 - 那么这是否意味着,在我调用的方法中实例化的扫描程序将继续保持打开状态,因此永远不会被垃圾收集?Java扫描仪最佳实践

例如:(裸骨)

private Scanner getDataFromWebService(String url) 
{ 
    URLConnection sc = null; 
    URL test = null; 
    Scanner scanner = null; 

    test = new URL(url); 
    sc = test.openConnection(); 
    in = new BufferedReader(new InputStreamReader(sc.getInputStream()); 

    scanner = new Scanner(in); 

    return scanner; 
} 

// Sample Call 

Scanner newScanner = getDataFromWebService(url); 

其次,如果你会这么好心迫使;那么对URLConnection和BufferedReader会发生什么,因为如果在返回getDataFromWebService方法中的扫描器之前关闭它们 - 它将使返回的扫描器“无效”。也许这个答案在于第一个问题。

什么是最好的做法在这里,只是从来没有返回一个复杂的对象......

+0

顺便说一句,您不需要该方法的前三行;您可以声明变量并将它们赋值,就像使用'null'做的那样,但是使用对象实例。 – Joey

+0

这个问题本质上是问Java是按值传递还是按引用传递。 – Raedwald

回答

4

您得到引用的副本。所以你仍然会使用同一个对象实例。

+0

感谢Joey,当我关闭扫描仪时,它也会关闭URLConnection和BufferedReader? –

+1

根据[Scaner](http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html#close())和[BufferedReader](http:/ /docs.oracle.com/javase/1.5.0/docs/api/java/io/BufferedReader.html#close())读取器将被关闭,但不是URLConnection。你知道,这些东西直接由文档回答,所以你可以自己查看它们。 – Joey