【问题标题】:Java return the Object/modify the object (coding guidelines)Java 返回对象/修改对象(编码指南)
【发布时间】:2011-07-07 11:03:46
【问题描述】:

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

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

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

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

【问题讨论】:

标签: java coding-style reference


【解决方案1】:

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

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

【讨论】:

  • StringBuilder 不返回其参数。它自己返回。
  • 注意:返回的是 OP 的参数,而不是声明方法的类型。
【解决方案2】:

我一般会选择Command-Query separation

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

        最好修改对象this,保持参数不变。

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

        以 StringBuilder 为例。

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 2023-03-25
            • 1970-01-01
            • 2012-06-30
            • 1970-01-01
            • 1970-01-01
            • 2017-07-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多