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 :
Pourrait devenir :
Cette amélioration se base sur une proposition simple : Faire que chaque méthode qui a pour type de retour
Pourrait être considérée comme :
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) :
Un deuxième, avec des JavaBeans (par Stefan Schulz) :
Et un dernier, avec des collections, présentant une nouvelle syntaxe spécifique pour les invocations chaînées (par Dr. Howard Lovatt) :
Liens bonus :
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 :
- Un patch pour javac, permettant de tester les invocations chaînées