JAVA返回对象或通过引用传递

Alt*_*ber 4 java methods return-value argument-passing

这是一个初学者的问题.

在将对象作为参数传递给方法或从该方法返回该对象之间,JAVA是否有任何区别.例如:将List作为参数传递并将其填入方法或仅允许方法返回列表是否更好?

我的猜测是,它应该没有区别,因为返回引用并且没有任何内容被复制.但是有什么更微妙的背后?

提前致谢

Altober

Kay*_*man 6

许多评论似乎误解了你的意思.

我相信你在问两者之间的区别

public void myMethod(List list) {
    list.add(new Object());
}
Run Code Online (Sandbox Code Playgroud)

和

public List myMethod() {
    List list = new ArrayList();
    list.add(new Object());
    return list;
}
Run Code Online (Sandbox Code Playgroud)

如我错了请纠正我.

没有规则说哪一个是对的.这一切都取决于您希望如何设计您的程序.后一种方法不允许您使用现有列表,因此可能会考虑性能问题.

您还可以在从方法返回值时执行方法链接,因此有时您可以同时接受参数并返回值.与此不同的是,如果将现有List作为参数传递,则将使用现有List,但如果参数为null,则创建新List.然而,这可能会使调用者感到困惑.


das*_*ght 4

首先,Java 中不存在“按引用传递”:该语言是按值传递引用(这不是同一件事)。

您的问题的答案是“这取决于”:将对象作为参数传递给方法可以让您在多次调用中重用同一对象,而返回对象则强制该方法向调用者提供新的或现有的对象。

考虑这个例子:您正在从多种方法收集数据,并且需要将所有数据放在一个列表中。您可以让方法返回带有数据的列表

interface DataSource {
    void supplyData(List<Data> list);
}
Run Code Online (Sandbox Code Playgroud)

或者您可以向这些方法传递一个列表,并让它们将数据添加到同一个列表中:

interface DataSource {
    List<Data> supplyData(); 
}
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,您可以循环访问多个数据源,向它们传递相同的列表:

List<Data> bigList = new ArrayList<Data>();
foreach (DataSource s : mySources) {
    s.supplyData(bigList);
}
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,您需要从 的调用中获取单独的列表supplyData,并将其内容放入您保留在循环中的大列表中:

List<Data> bigList = new ArrayList<Data>();
foreach (DataSource s : mySources) {
    List<Data> tmp = s.supplyData();
    bigList.addAll(tmp);
}
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,每次调用都会创建一个临时列表tmp,该列表在其内容添加到大列表后会被丢弃。

请注意,传递现有列表不一定是更好的解决方案 - 事实上,在某些情况下您应该避免这种情况。

例如,当您处理外部提供的插件时,您应该更喜欢第二种策略。否则,接口的恶意实现DataSource将能够以程序预期之外的方式操作公共列表,例如将其项目添加到其他项目之前、删除来自其他来源的项目、检查来自其他来源的项目等等在。