方法链中的Java [关闭](Method Chaining in Java [closed])

2019-06-26 09:58发布

虽然在这里较早,从一些工作回答了几个问题,我一直在做最近我一直在想,为什么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);

我听到这个决定背后的原因很感兴趣,如果我猜这将是没有与此相关的开销,因此在需要时,才应使用。

Answer 1:

呃。 有一个在两个方向上进行可读性论点 - 有这样的事,作为试图把过多成一行。

但说实话,我怀疑这里是历史原因:无处不在“链接”的行为并没有真正成为流行时或正在开发如秋千知名。 你可以说,它应该已经被添加的,后来,但这样的事情往往造成二进制不兼容等问题,Sun公司/甲骨文在历史上一直异常谨慎。

最近的JDK库-例如参见ByteBuffer承重大,著名的例子- 已经提供链接行为等等,其中很有道理。



Answer 2:

我能想到的另一个原因是性能 ,或者更准确地说:不支付的东西,你不使用。 return this每一个方法是不是很昂贵后,但仍需要一些额外的CPU周期和一个CPU注册表。

甚至有一个想法,以隐添加return this到每一个方法宣告void返回值,但遭到拒绝。



Answer 3:

尽管我们可以猜测,但作为真正的原因,其中之一可能是,严格来说,它不是很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()看起来不是很好,对吧:)



Answer 4:

方法链通常使用的Builder模式,你可以在此看到StringBuilder类。 的那个外,方法链接可以使命令和创造分离不太清楚,例如应该repaint()也可以是连贯接口的一部分? 然后,我可能有:

container.add(label).repaint().setMaximumSize(new Dimension(100,200)));

突然我的电话的顺序变得很重要,可以得到隐藏在方法链接。



Answer 5:

你真的问的得墨忒耳定律

“只有跟你的朋友即时”

需要注意的是上面的链接是一个很好的资源,但你可以花很长一段时间存在,并没有得到你正在寻找一个答案! :-)



Answer 6:

背后不执行方法链接的原因是以下一些:

  • 对于方法链接的最大问题是整理问题。 虽然有解决方法,通常,如果你遇到了这个你过使用嵌套函数更好。 嵌套函数也是一个更好的选择,如果你正在与上下文变量一塌糊涂。

  • 有没有保证物体掉了链子实际上将返回一个有效的,非空的对象。 此外,调试代码的这种风格,因为往往很多困难许多* IDE * S不会评价在调试时的方法调用作为一个对象,你可以检查

  • 当你调用程序来其他类参数传递给链接方法之一,当有很多的参数主要是通过,因为该线路会很长它可能会比较混乱

  • 还有一个性能问题,这将大力内存



文章来源: Method Chaining in Java [closed]