0

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

方法一:

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

方法二:

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

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

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

4

4 回答 4

2

数组不可调整大小。因此,使用方法 1,您可以创建一个大小合适的新数组并将其返回。使用方法 2,如果传入的数组大小不正确,那么你就沉没了。

Java 没有按引用传递。因此,在方法 2 中分配一些东西someObject不会为调用者做任何事情。您只能更改的元素someObject

于 2013-08-28T00:55:39.410 回答
1

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


版本 #1

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

优点:

  • 这允许您返回任意数量的结果。
  • 对于呼叫者来说,这可以说是更容易。

缺点:

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

版本 #2

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

优点:

  • 就分配的对象而言,这可能会更好,因为调用者将处于更好的位置来回收/重用数组。
  • 如果需要,它允许您在...中传递值。

缺点:

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

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


哪个更好?

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

最后,比上述所有方法更简单/更清洁的方法是使用 aCollection而不是裸数组。使用标准Collection类型可以避免预先分配正确大小的东西的混乱。

于 2013-08-28T01:34:05.677 回答
1

Java 有一种参数传递机制:一切都按值传递,而不是按引用传递。

这很微妙,但却是真实的。影响很重要。

您当然可以随时从该方法返回,无论是数组List、 还是Set. 您可能会也可能不会更改Listor的内容Set,因为编写该方法的开发人员可能已将其下的实现设为不可修改。

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

于 2013-08-28T01:03:17.377 回答
1

Return 写和读起来更自然,也可以通过“参考”传递,正如你所说的那样,它的复杂性比眼睛看到的要多。

someObject[i] = a; //works

someObject = a; // doesnt work
于 2013-08-28T00:56:10.030 回答