在Java中,练习返回自身而不是void。

8

我的团队成员向我介绍了一种新的编写方法,它不会返回空值。

public class Test {
   public Test doCalculations() {
      //code
      return this;
   }
   public Test appendTitle(String test) {
      //code
      return this;
   }
}

他们建议返回对象本身而不是返回void。这种方法的一个优点是,你可以链式调用方法。

不要写成:

 while(1) {
    test.appendTitle("aaa");
    test.doCalculations();
    map.add(test);
 }

你可以编写更优雅的代码:
 while(1) {
     map.add(test.appendTitle("aaa").doCalculations());
 }

这种方法可能存在什么缺点?您建议将其纳入日常使用吗?

3
我建议你研究一下装饰器设计模式。当然,你需要思考何时应用它。 - Ivaylo Strandjev
1
被称为“流畅接口”(但不仅限于此)。我建议在每个“.”之前换行。 - Joop Eggen
为了辩护,我没有发现这个问题:“Benefits..”,而且问题表述晦涩难懂,我认为很少有人能理解正在发生什么。 - Igor S.
1个回答

2

我认为这不是一个好的做法。通过查看返回对象的方法签名,我怎么知道返回的是全新的实例还是现有的实例呢?请注意,在不可变类的情况下,修改方法确实会返回一个类的全新实例。


4
如果类被称为Builder或类似的名称,我认为这相当清晰明了。 - assylias
这是真的,但这个问题似乎比那个更普遍。 - Richard Tingle
1
这并不是一种不好的实践,事实上它被用于许多配置对象、构建器对象,而且应该在任何需要调用设置器超过1-2次的地方使用。显然它返回的是自身而不是一个新实例,否则Javadoc应该明确说明。使用该模式的示例包括:Hibernate Criteria、Astyanax、Cloudera的Hadoop配置等等。毫无疑问,它们的开发人员对API开发有所了解,因此我认为接受的答案完全是错误的。 - Nikola Yovchev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接