Chained invocation in Java 7?

java, java-7, language-design, language-features

Solution

the with statement can be translated in Java using anonymous classes with initializer:

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

the downsides of using this idiom are well documented here.

Chained Invocation is an alias for Method Chaining. That is well known idiom and works with any version of Java:

class Chained {

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

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

a proposal for JDK 7 is allowing of chaining method also for void return type:

class ChainedJava7 {

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

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

Problem

I was just reading a Java 7 preview presentation (pdf) and there was a slide on Chained Invocation. Here is the example used in the slide: ``` // 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(); ``` And I have mixed feelings about this. One shouldn't chain too many method invocations into one statement. On the other hand, writing `margarita.this()` and `margarita.that()` isn't too convenient either. Now, I am coming to Java from Delphi world. And in Delphi there is the `with` language construct. This is cherished by a few and loathed by many (or is it the other way around?). I find `with` to be more elegant than the idea of chained invocation (which I believe works on the basis of `void` method returning reference to object on which it has been invoked - and this is the part I don't like, as `void` should return nothing). I would appreciate the `with` language feature being adopted by Java, so the example code could be written like so: ``` Drink margarita = null; with (new DrinkBuilder()) { add("tequila"); add("orange liqueur"); add("lime juice"); withRocks(); withSalt(); margarita = drink(); } ``` Am I the only one who would prefer this solution to the chained invocation? Anyone else feels that `with` could be a useful extension to Java language? (Reminds me of someone's question about the need of "Java++"...)

Original source

Related problems