40

之前在这里回答了一些问题以及我最近一直在做的一些工作时,我一直想知道为什么 Java 不支持其内置类的方法链接。

例如,如果我要创建一个Car类,我可以通过 reutrningthis不是 void 使其可链接,如下所示:

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

我很想听听这个决定背后的原因,如果我不得不猜测这将是与此相关的开销,因此应该只在需要时使用。

4

6 回答 6

34

嗯。在两个方向上都存在可读性论点——比如试图在一行中放太多东西。

但老实说,我怀疑这是出于历史原因:在开发例如 Swing 时,普遍的“链接”行为并没有真正流行或广为人知。您可能会争辩说它应该在以后添加,但这样的事情往往会造成二进制不兼容以及 Sun/Oracle 历来非常谨慎的其他问题。

更新的 JDK 库——例如ByteBuffer一个主要的、众所周知的例子——提供了链式行为等,这是有意义的。

于 2012-07-19T13:26:24.310 回答
19

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

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

于 2012-07-19T13:28:16.660 回答
9

虽然我们只能猜测真正的原因,但其中之一可能是严格来说它不是很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()看起来不太好,是吗:)

于 2012-07-19T13:25:35.153 回答
4

方法链通常与 Builder 模式一起使用,您可以在StringBuilder类中看到这一点。除此之外,方法链接可以使命令和创建分离不太清晰,例如repaint()也应该是流利界面的一部分?然后我可以:

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

突然我的调用顺序变得很重要,它可以隐藏在方法链中。

于 2012-07-19T13:28:28.190 回答
1

未实现方法链接的原因可能有以下几点:

  • Method Chaining 最大的问题是完成问题。虽然有一些变通方法,但通常如果遇到这种情况,最好使用嵌套函数。如果您陷入上下文变量的混乱,嵌套函数也是一个更好的选择。

  • 无法保证链外的对象实际上会返回有效的非空对象。此外,调试这种代码风格通常要困难得多,因为许多 *IDE* 不会在调试时将方法调用评估为可以检查的对象

  • 当您调用其他类的例程以将参数传递给链接方法之一时,当有很多参数要传递主要是因为行变得很长时,它可能会令人困惑

  • 还有一个性能问题,会在内存上下功夫

于 2012-07-19T13:30:54.617 回答
1

你真的在问得墨忒耳法则

“只和你的直系朋友交谈”

请注意,上面的链接是一个很好的资源,但是您可能会在那里花费很长时间而没有得到您正在寻找的答案!:-)

于 2012-07-19T13:48:25.553 回答