虽然在这里较早,从一些工作回答了几个问题,我一直在做最近我一直在想,为什么Java不支持其内置类方法链接。
如果我要建立一个Car
如阶级,我可以使它通过reutrning 可链接的 this
,而不是空洞如下:
public class Car {
private String make;
public Car setMake(String make) {
this.make = make;
return this;
}
}
有没有什么特别的原因,为什么建库中不倾向于这样做事? 是否有一个缺点方法链接?
我可能忽略了一些东西,可以解释缺乏方法链的但是在默认情况下返回void任何setter方法应该返回到这个参考(至少在我眼里它应该)。 这将使类似下面的更清洁的情况。
container.add((new JLabel("label text")).setMaximumSize(new Dimension(100,200)));
而不是更长篇大论: 注意:它不会从,如果你希望编码这种方式阻止你。
JLabel label = new JLabel("label text");
label.setMaximumSize(new Dimension(100,200));
container.add(label);
我听到这个决定背后的原因很感兴趣,如果我猜这将是没有与此相关的开销,因此在需要时,才应使用。
呃。 有一个在两个方向上进行可读性论点 - 有这样的事,作为试图把过多成一行。
但说实话,我怀疑这里是历史原因:无处不在“链接”的行为并没有真正成为流行时或正在开发如秋千知名。 你可以说,它应该已经被添加的,后来,但这样的事情往往造成二进制不兼容等问题,Sun公司/甲骨文在历史上一直异常谨慎。
最近的JDK库-例如参见ByteBuffer
承重大,著名的例子- 已经提供链接行为等等,其中很有道理。
我能想到的另一个原因是性能 ,或者更准确地说:不支付的东西,你不使用。 return this
每一个方法是不是很昂贵后,但仍需要一些额外的CPU周期和一个CPU注册表。
甚至有一个想法,以隐添加return this
到每一个方法宣告void
返回值,但遭到拒绝。
尽管我们可以猜测,但作为真正的原因,其中之一可能是,严格来说,它不是很OO。
如果您查看方法为行动表示建模世界的一个动作,方法链并没有真正与之相适应。
另一个原因可能是,当你试图覆盖一个链接方法可能引发混乱。 想象一下这样的情况:
class Foo {
Foo chainedMethod() {...}
}
class Bar extends Foo {
Foo chainedMethod() {...} //had to return Foo for Java versions < 1.5
void doStuff();
}
因此,当你尝试做new Bar().chainedMethod().doStuff()
它不会编译。 而((Bar)new Bar().chainedMethod()).doStuff()
看起来不是很好,对吧:)
方法链通常使用的Builder模式,你可以在此看到StringBuilder
类。 的那个外,方法链接可以使命令和创造分离不太清楚,例如应该repaint()
也可以是连贯接口的一部分? 然后,我可能有:
container.add(label).repaint().setMaximumSize(new Dimension(100,200)));
突然我的电话的顺序变得很重要,可以得到隐藏在方法链接。
你真的问的得墨忒耳定律
“只有跟你的朋友即时”
需要注意的是上面的链接是一个很好的资源,但你可以花很长一段时间存在,并没有得到你正在寻找一个答案! :-)