Java 中的方法链接 [已关闭]

2022-09-01 03:06:49

虽然之前在这里回答了一些问题,并且我最近一直在做一些工作,但我一直在想为什么Java不支持在其内置类上进行方法链。

例如,如果我要创建一个类,我可以通过重新utring而不是void来使其可链接,如下所示:Carthis

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);

我非常有兴趣听到这个决定背后的原因,如果我必须猜测,那就是有与此相关的开销,因此应该只在需要时使用。


答案 1

啊。在两个方向上都有可读性参数 - 有这样的事情,试图在一行中放入太多东西。

但老实说,我怀疑这是出于历史原因:当例如Swing被开发时,普遍的“连锁”行为并没有真正变得流行或知名。你可以争辩说它应该在以后添加进来,但这样的事情往往会造成二进制的不兼容性和其他问题,Sun/Oracle在历史上一直非常谨慎。

最近的JDK库 - 例如,参见ByteBuffer的一个主要的,众所周知的例子 - 提供了链接行为等,这是有意义的。


答案 2

我能想到的另一个原因是性能,或者更准确地说:不要为你不使用的东西付费。 在每种方法之后,成本都不是很高,但仍然需要很少的额外CPU周期和一个CPU注册表。return this

甚至有一个想法将隐式添加到每个声明返回值的方法中,但它被拒绝了。return thisvoid