Jon*_*lor 39 java methods method-chaining chaining
虽然我早些时候在这里回答了一些问题,但最近我一直在做的一些工作中,我一直在想为什么Java不支持对其内置类进行方法链接.
Car例如,如果我要创建一个类,我可以通过reutrning 而不是void来使它可链接,this如下所示:
public class Car {
private String make;
public Car setMake(String make) {
this.make = make;
return this;
}
}
Run Code Online (Sandbox Code Playgroud)
内置库不倾向于以这种方式做事有什么特别的原因吗?方法链是否存在缺点?
我可能忽略了一些可以解释缺少方法链接的东西,但是默认情况下返回void的任何setter方法应该返回对此的引用(至少在我看来应该如此).这将使以下情况变得更加清洁.
container.add((new JLabel("label text")).setMaximumSize(new Dimension(100,200)));
Run Code Online (Sandbox Code Playgroud)
而不是更长时间的啰嗦:注意:如果你愿意,它不会阻止你以这种方式编码.
JLabel label = new JLabel("label text");
label.setMaximumSize(new Dimension(100,200));
container.add(label);
Run Code Online (Sandbox Code Playgroud)
我非常有兴趣听到这个决定背后的原因,如果我不得不猜测会有与此相关的开销,所以只应在需要时使用.
Lou*_*man 34
呃.可以在两个方向上进行可读性论证 - 这样的事情就是试图将过多的东西放在一条线上.
但老实说,我怀疑这是出于历史原因:当Swing正在开发时,普遍的"链接"行为并没有真正变得流行或众所周知.您可能会争辩说它应该在以后添加,但是这样的事情往往会产生二进制不兼容性以及Sun/Oracle历来非常谨慎的其他问题.
更新的JDK库 - 例如参见ByteBuffer一个主要的,众所周知的例子 - 已经提供了链接行为等,它是有意义的.
Tom*_*icz 19
我能想到的另一个原因是性能,或者更确切地说:不要为不使用的东西买单.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();
}
Run Code Online (Sandbox Code Playgroud)
因此,当您尝试这样做时new Bar().chainedMethod().doStuff(),它将无法编译.而且((Bar)new Bar().chainedMethod()).doStuff()看起来不太好,是吗:)
| 归档时间: |
|
| 查看次数: |
12033 次 |
| 最近记录: |