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

Java返回对象/修改对象(编码指南),java,coding-style,reference,Java,Coding Style,Reference,如果一个方法填充/修改一个对象,那么返回该对象还是将返回类型保持为void,并且该方法将通过其引用修改该对象更可取 public Obj populate(Obj o) { .... return o; } public void populate(Obj o) { .... } 我知道这是一个无关紧要的问题,但哪一个是最受欢迎的?我取决于您的风格,但返回的一个优点是:您可以调用populate(o).doSomethingElse(),即您可以链接方法调用 看看StringBuilder是

如果一个方法填充/修改一个对象,那么返回该对象还是将返回类型保持为void,并且该方法将通过其引用修改该对象更可取

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

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

我知道这是一个无关紧要的问题,但哪一个是最受欢迎的?

我取决于您的风格,但返回的一个优点是:您可以调用
populate(o).doSomethingElse(),即您可以链接方法调用

看看
StringBuilder
是如何实现的,例如,它允许像这样的
new StringBuilder().append(“a”).append(“b”)…

我会说“first”选项返回对象。这没有任何缺点,并且为您将来在不修改签名的情况下更改实现留下了“空间”(例如,返回“深度副本”而不是相同的对象)


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

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

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为例。

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

我一般会同意

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


但是,在某些情况下(如上面的维基百科文章所述),违反此一般原则是适当的。

StringBuilder不返回其参数。它返回自身。注意:它返回的是OP的参数,而不是声明方法的类型。对我来说,“return o”语句取决于它的conrete实现。通过引用传递对象将修改堆栈中的对象。对我来说,不需要“returno”语句。