返回此内容有什么问题?

2022-09-03 15:13:37

在我工作的公司,有一个文档描述了我们应该在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");

我会尝试与发起人取得联系,但我想在上膛枪的情况下做到这一点,这就是我发布这个问题的原因。

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


答案 1

我的猜测是,他们反对可变状态(而且通常是正确的)。如果您不是在设计返回流利的接口,而是返回具有已更改状态的对象的新不可变实例,则可以避免同步问题或没有 .这可以解释他们的要求。this"failed expectations about the states of target objects"


答案 2

这种做法的唯一严肃基础是避免可变对象;批评它“令人困惑”并导致“期望失败”是相当弱的。在没有首先熟悉对象的语义之前,永远不应该使用对象,并且仅仅为了迎合那些选择不阅读Javadoc的人而对API强制实施约束根本不是一个好的做法 - 特别是因为,正如你所注意到的,返回以实现流畅的API设计是Java中的标准方法之一, 而且确实是一个非常受欢迎的。this