Java 7 : Chained invocation

Après l'amélioration de la boucle for-each et les chaînes de caractères multi-lignes, je continue aujourd'hui ma série de billets autour de Java 7.

Au sujet du jour, les invocation chaînées. Derrière un nom barbare se cache un principe simple : pouvoir enchaîner les invocations de méthodes sans devoir rappeler le nom de l'objet à chaque invocation. Un petit exemple :
List list = new ArrayList();
list.add(0, "a");
list.add(1, "b");
list.add(2, "c");
list.add(3, "d");

Pourrait devenir :
List list = new ArrayList().add(0, "a")
            .add(1, "b")
            .add(2, "c")
            .add(3, "d");

Cette amélioration se base sur une proposition simple : Faire que chaque méthode qui a pour type de retour void renvoie implicitement une référence vers l'objet appelé (this). Un peu comme si toutes les méthodes ayant void pour type de retour étaient récrites :
public SomeClass {
    public void doSomeStuff() {
        // Some stuff
    }
}

Pourrait être considérée comme :
public SomeClass {
    public Class doSomeStuff() {
        // Some stuff
        return (this);
    }
}

Les avantages d'une telle fonctionnalité sont présentés un peu partout, dans différents cas d'utilisations, et avec différentes syntaxes.

Un premier exemple, en Swing (par Matthias Ernst) :
JFrame frame = new JFrame().setTitle("Frame").setBounds(100, 100, 100, 100).setVivible(true);

Un deuxième, avec des JavaBeans (par Stefan Schulz) :
Person person = new Person()  
        .setName("Costanza")  
        .setFirstName("George")  
        .setGender(Gender.MALE)  
        .setAge(35);
Et le même exemple, avec une syntaxe particulière, basée sur le do :
Person person = new Person() do {
    setName("Costanza");
    setFirstName("George");
    setGender(Gender.MALE);
    setAge(35);
};
Cette syntaxe permettrait d'ajouter de la logique dans les invocations chaînées :
String str = new StringBuilder() do {  
    append(person.getName());  
    if (person.isMarried()) {  
        append("(married)");  
    }  
}.toString(); 
Je dois avouer que j'ai un petit faible pour cette solution :)

Et un dernier, avec des collections, présentant une nouvelle syntaxe spécifique pour les invocations chaînées (par Dr. Howard Lovatt) :
list -> { add( 1, "A" ); add( 2, "B" ); };

Liens bonus :

Permalink  |  Commentaires (0)


Comments:

Post a Comment:
  • HTML Syntax: Allowed