【发布时间】:2013-04-17 12:39: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 无关,因为您可能会犯同样的错误,购买一个一个调用这些方法,并且更多地与正确同步构建过程有关。他承认该文件可能会更加明确,并将很快对其进行修改。胜利是我/我们的!
【问题讨论】:
-
“同步问题”?我无法想象这将如何产生(双关语不是故意的,而是可以容忍的)。像几乎所有其他模式一样,它有很好的用途和误用,但我不明白你得到的推理。也许可以向该文件的作者寻求澄清。
-
stackoverflow.com/questions/1345001/… 上还有另一篇关于此的帖子
-
我也不明白这种说法。
-
如果我希望我的(假设的)下属停止做我不喜欢但不想承认我的理由是95% 审美。 (另请参阅:支持或反对 OTBC / K&R 风格的每一个论点。)
-
如果您在两个线程中执行了
buff.append("Hello, ").append("World\n"),其中buff是StringBuffer,您最终可能会得到“Hello, Hello, World\nWorld\n”。但是,StringBuffer拥有所有同步并没有多大意义,它告诉您“良好做法”。 (OTOH,返回this确实表明语言存在问题。)