Java 什么';退回这个有什么不对?

Java 什么';退回这个有什么不对?,java,oop,this,Java,Oop,This,在我工作的公司,有一个文档描述了我们应该在Java中遵循的良好实践。其中之一是避免返回this的方法,例如: class Properties { public Properties add(String k, String v) { //store (k,v) somewhere return this; } } 我会上这样的课,这样我就能写: properties.add("name", "john").add("role","swd"). ... 我已经见

在我工作的公司,有一个文档描述了我们应该在Java中遵循的良好实践。其中之一是避免返回
this
的方法,例如:

class Properties {

  public Properties add(String k, String v) {
   //store (k,v) somewhere
     return this;
  }

}
我会上这样的课,这样我就能写:

 properties.add("name", "john").add("role","swd"). ...
我已经见过很多次这样的习惯用法,比如在
StringBuilder
中,没有发现任何错误

他们的论点是:

。。。可能是同步问题或目标对象状态预期失败的根源

我想不出这是真的,你们能给我举个例子吗

编辑文档没有指定任何关于可变性的内容,因此我看不出链接调用和执行以下操作之间的区别:

properties.add("name", "john");
properties.add("role", "swd");
我会尝试与发起者联系,但我想用我的枪来做,这就是为什么我发布了这个问题


已解决:我与其中一位作者进行了交谈,他的初衷显然是避免释放尚未准备好的对象,如生成器模式,并解释说,如果调用之间发生上下文切换,对象可能处于无效状态。我认为这与返回
this
无关,因为你可能会犯同样的错误,一个接一个地调用这些方法,而更多的是与正确地同步构建过程有关。他承认该文件可能会更加明确,并将很快对其进行修订。胜利是我的/我们的

我的猜测是,他们反对可变状态(而且通常是正确的)。如果您不是在设计返回此的流畅接口,而是返回具有更改状态的对象的新的不可变实例,则可以避免同步问题,或者没有“关于目标对象状态的失败预期”。这或许可以解释他们的要求

我认为有时候这种方法非常有用,例如在“builder”模式中

我可以说,在我的组织中,这类事情是由声纳规则控制的,我们没有这样的规则

另一种猜测是,该项目可能是在现有代码库的基础上构建的,这是一种遗留限制

所以我唯一能建议的就是和写这篇文章的人谈谈:)


希望这有帮助

练习的唯一重要基础是避免可变对象;批评它“令人困惑”并导致“预期失败”的声音相当微弱。如果不先熟悉对象的语义,就不应该使用对象,而仅仅为了迎合那些选择不阅读Javadoc的人而对API施加约束根本不是一个好的做法,特别是因为,正如您所指出的,返回
这个
来实现流畅的API设计是Java中的标准方法之一,确实是一种非常受欢迎的方法。

我认为在某些情况下使用这种模式是完全可以接受的

例如,作为一名Swing开发人员,我经常使用GridBagLayout,因为它的优点和灵活性,但是任何使用过它的人(在crime GridBagConstraints中使用它的partener)都知道它可能非常冗长,可读性不强

我在网上看到的一个常见的解决方法(也是我使用的方法)是对GridBagConstraints(GBConstraints)进行子类化,该子类对每个不同的属性都有一个setter,每个setter都会返回这个结果。这允许开发人员根据需要链接不同的属性


结果代码的大小约为1/4,可读性/可维护性更高,即使对于不熟悉使用GridBagConstaints的普通开发人员也是如此。

“同步问题”?我无法想象这是怎么回事(双关语不是有意的,而是可以容忍的)。和几乎所有其他模式一样,它也有好的用途和错误的用途,但我不理解你给出的理由。也许可以请该文件的作者澄清一下。关于这一点,我也不理解这一论点。如果我想让我的(假设的)下属停止做我不喜欢但不想承认我的理由是95%的美感,那么我会用这种空泛、空洞的废话。(另请参见:支持或反对OTBC/K&R样式的每个参数。)如果您在两个线程中执行了
buff.append(“Hello,”).append(“World\n”)
,其中
buff
StringBuffer
,您可能会以“Hello,Hello,World\nWorld\n”结束。然而,拥有所有同步功能的
StringBuffer
并没有多大意义,这告诉了您“良好实践”。(OTOH,返回
this
确实表明该语言存在问题。)请解释一下,从实例方法返回this如何影响不变性?返回对不可变对象的引用有什么不好?