我正在设计一个类的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传递引用还是值”。它只是简单地比较两种可行的做事方式。
答案 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
。您可能会也可能无法更改List
或Set
的内容,因为编写该方法的开发人员可能无法修改下面的实现。
就个人而言,我更喜欢集合而不是数组。它们比原始数组更具表现力。如果我得到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
类型可以避免预先分配正确大小的内容的混乱。