Java返回Object /修改对象(编码指南)

如果一个方法填充/修改一个对象,是否最好返回该对象或将返回类型保持为void,该方法是否会通过其引用修改Object?

public Obj populate(Obj o) { .... return o; } public void populate(Obj o) { .... } 

我知道这是一个微不足道的问题,但哪一个是最受欢迎的?

我取决于你的风格,但返回的一个好处是:你可以调用populate(o).doSomethingElse(); ,即你可以链接方法调用。

看看StringBuilder是如何做到这一点的,例如,它允许像这样的new StringBuilder().append("a").append("b")....

我一般会使用Command-Query分离 。

也就是说,如果方法改变了参数,它也不应该返回参数。

但是,如上面的维基百科文章中所述,违反这一一般原则的情况是适当的。

我会说“第一个”选项,返回对象。 这没有任何缺点,并且在未修改签名的情况下,为将来实现更改(例如,返回“深层复制”而不是相同的对象)留下“空间”。

简而言之,我认为它更灵活。

我会选择第一个,因为它允许您选择修改您传递的对象并将其返回,或者获取对象的副本并返回副本。

 public Obj populate(Obj o) { Obj returnObj = o.clone(); .... return returnObj; } 

这允许您保留对原始对象的引用并引用已修改的对象。

最好修改对象并保持对齐不变。

 class ModifiedType { public ModifiedType populate(UnmodifiedType arg) { return this; } // or public void populate(UnmodifiedType arg) { } } 

以StringBuilder为例。

第二个对我来说不那么容易混淆,因为从第一个看起来不清楚是否返回并且传递的对象是相同的,我发现忽略返回值并不正常。