问题: 我有一个方法,用BufferedReader实例化一个新的扫描仪类,并返回扫描仪类本身。据我所知,Java将返回Scanner类 - 作为对象的“副本”(pass-by-value),而不是我们在C ++中称为Reference或Pointer。如果逻辑是正确的 - 这是否意味着,在我调用的方法中实例化的Scanner将继续保持OPEN,从而永远不会被垃圾收集?
例如:(裸骨)
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 :(得分:4)
您获得了参考文献的副本。所以你仍然会使用相同的对象实例。