Java 7中的链式调用?

Pet*_*háč 6 java language-features language-design java-7

我刚刚阅读了Java 7预览演示文稿(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();
Run Code Online (Sandbox Code Playgroud)

我对此感到复杂.不应该将太多的方法调用链接到一个语句中.在另一方面,写作margarita.this()margarita.that()不是太方便无论是.

现在,我从Delphi世界来到Java.在Delphi中有with语言结构.这是少数人所珍惜和许多人的厌恶(或者是相反的方式?).我觉得with比链式调用的想法更优雅(我认为它基于void方法返回对它被调用的对象的引用 - 这是我不喜欢的部分,因为void应该什么都不返回).

我很欣赏withJava采用的语言功能,因此示例代码可以像这样编写:

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

我是唯一一个更喜欢链式调用的解决方案的人吗?其他人认为这with可能是Java语言的有用扩展吗?(让我想起有人对"Java ++"需求的质疑......)

dfa*_*dfa 13

语句可以在Java中使用匿名类与初始化翻译:

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

使用这个习语的缺点在这里有详细记载.

链式调用是Method Chaining的别名.这是众所周知的习惯用法,适用于任何版本的Java:

class Chained {

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

    public Chained withBar() { 
        // ...
        return this;
    }
}    
Run Code Online (Sandbox Code Playgroud)

JDK 7的提议允许链接方法也用于void返回类型:

class ChainedJava7 {

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

    public void withBar() { 
        // ...
    }
}    
Run Code Online (Sandbox Code Playgroud)

  • 请注意,几个月前,JDK7的小语言更改截止日期已过. (2认同)