Java返回对象/修改对象(编码指南)
如果一个方法填充/修改一个对象,那么返回该对象还是将返回类型保持为void,并且该方法将通过其引用修改该对象更可取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是
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”语句。