Java返回数组与通过引用传递

时间:2013-08-28 00:53:35

标签: java android

我正在设计一个类的API函数,它将返回一个数组供客户端使用。但是我不太确定我是应该将它作为返回值还是将其作为函数的参数。参见下文:

方法I:

MyObject[] getMyObject() {... return someObject;}

方法II:

void getMyObject(MyObject[] someObject) {...//assign value to someObject[index]};

在Android API中,我发现返回List<MyObject>Set<MyObject>非常常见。它是否表明方法I更好?那么Java中这两种方法的优点和缺点是什么?

更新:在方法II中,我的意思是为someObject [index]赋值,而不是someObject。我的问题不是关于“Java传递引用还是值”。它只是简单地比较两种可行的做事方式。

4 个答案:

答案 0 :(得分:2)

数组无法调整大小。因此,使用方法1,您可以创建一个具有正确大小的新数组并返回该数组。使用方法2,如果传入的数组大小错误,那么你就是沉没。

Java没有pass-by-reference。因此,在方法2中为someObject分配内容不会对调用者执行任何操作。您只能更改someObject元素

答案 1 :(得分:1)

回归是更自然的写作和阅读,也可以通过“参考”,因为你称它有比眼睛更多的并发症..

someObject[i] = a; //works

someObject = a; // doesnt work

答案 2 :(得分:1)

Java有一个参数传递机制:所有通过值传递,不是通过引用传递。

这很微妙,但却是如此。影响很重要。

您可以随时从该方法返回,无论是数组,List还是Set。您可能会也可能无法更改ListSet的内容,因为编写该方法的开发人员可能无法修改下面的实现。

就个人而言,我更喜欢集合而不是数组。它们比原始数组更具表现力。如果我得到Set,我知道所有条目在某种程度上都是唯一的。

答案 3 :(得分:1)

两种方式都有优点和缺点。


版本#1

MyObject[] getMyObject() {... return someObject;}

优点:

  • 这允许您返回任意数量的结果。
  • 调用者可以说更容易。

缺点:

  • 被调用的方法必须分配一个数组。 (或者,它必须管理/回收数组,这通常很难做到。请注意,重用静态数组可能会使该方法不可重入,等等。)

版本#2

void getMyObject(MyObject[] someObject) {...//assign value to someObject[index]};

优点:

  • 就分配的对象而言,这可能更好,因为调用者可以更好地回收/重用数组。
  • 它允许您传递值...如果这是一个要求。

缺点:

  • 调用者来提供数组,这使得该方法更易于使用。
  • 被调用的方法无法控制数组大小。这意味着如果提供的数组太小,则存在潜在的错误情况......

还有第三种方法,即传递的数组。如果数组大小不正确(或者如果传递了null),则被调用的方法会分配或重新分配数组。结果是原始数组或重新分配的数组。


哪个更好?

IMO,在大多数情况下,第一个版本更好,因为它最容易做对。 IMO,如果可证明需要最小化新对象分配,您应该只考虑API设计中的替代方案。 (如果您正在编写Hotspot Java实现或等效代码,则新对象分配很便宜......)

最后,比上述所有方法更简单/更清晰的方法是使用Collection而不是裸阵列。使用标准Collection类型可以避免预先分配正确大小的内容的混乱。