gpt4 book ai didi

java - Java 7 中的链式调用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:42:24 25 4
gpt4 key购买 nike

我刚刚在读 Java 7 preview presentation (pdf)还有一张关于链式调用的幻灯片。这是幻灯片中使用的示例:

// Construction with setters
DrinkBuilder margarita = new DrinkBuilder();
margarita.add("tequila");
margarita.add("orange liqueur");
margarita.add("lime juice");
margarita.withRocks();
margarita.withSalt();
Drink drink = margarita.drink();

// Construction with chained invocation
Drink margarita = new DrinkBuilder()
.add("tequila")
.add("orange liqueur")
.add("lime juice")
.withRocks()
.withSalt()
.drink();

我对此有复杂的感受。不应将太多方法调用链接到一个语句中。另一方面,编写 margarita.this()margarita.that() 也不太方便。

现在,我从 Delphi 世界来到 Java。在 Delphi 中有 with语言构造。这被少数人所珍视,而被许多人所厌恶(或者恰恰相反?)。我发现 with 比链式调用的想法更优雅(我相信它基于 void 方法返回对调用它的对象的引用 - 并且这是我不喜欢的部分,因为 void 应该返回 nothing)。

我希望 Java 采用 with 语言特性,所以示例代码可以这样写:

Drink margarita = null;
with (new DrinkBuilder()) {
add("tequila");
add("orange liqueur");
add("lime juice");
withRocks();
withSalt();
margarita = drink();
}

我是唯一一个更喜欢这种解决方案而不是链式调用的人吗?还有其他人认为 with 可能是对 Java 语言的有用扩展吗? (让我想起了某人关于“Java++”的需求的问题......)

最佳答案

with 语句可以在 Java 中使用带初始值设定项的匿名类来翻译:

Drink margarita = new DrinkBuilder() {{
add(“tequila”);
add(“orange liqueur”);
add(“lime juice”);
withRocks();
withSalt();
}}.drink();

使用此习语的缺点有据可查 here .

Chained Invocation 是 Method Chaining 的别名。这是众所周知的习惯用法,适用于任何版本的 Java:

class Chained {

public Chained withFoo() {
// ...
return this;
}

public Chained withBar() {
// ...
return this;
}
}

JDK 7 的提案是 allowing of chaining method also for void return type :

class ChainedJava7 {

public void withFoo() {
// ...
}

public void withBar() {
// ...
}
}

关于java - Java 7 中的链式调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1011916/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com