Java 7 : Diamond syntax et constructeurs simplifiés pour la généricité
Par Frédéric Martini

Le , par vbrabant, Expert éminent sénior
27/08/2009 :
C'est fait : cette proposition a été intégré dans Java 7 sous le nom de "diamond syntax". Plus d'information sur http://blog.developpez.com/adiguba/p...iamond-syntax/

16/12/2007 :

Neal Gafter et Joshuah Bloch ont proposé lors d'un BOF qui s'est tenu à Javapolis 2007 certains changements au niveau du langage Java qui pourraient être introduits dans le JDK7. Le but ici est de recueillir vos votes et commentaires, de les consolider, et de les remonter à Neal Gafter et Joshuah Bloch.
D'autres JUG répartis un peu partout dans le monde feront de même. Ce qui permettra d'avoir le maximum de retour de la communauté Java.

Ne manquez pas cette chance unique de pouvoir donner votre avis concernant le futur de Java.

Aujourd'hui :
Code : Sélectionner tout
1
2
3
 
Map<String, List<String>>  
  anagrams = new HashMap<String, List<String>>();
Demain :
Code : Sélectionner tout
1
2
Map<String, List<String>>  
  anagrams = new HashMap<>();


Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :


 Poster une réponse

Avatar de deltree deltree - Membre averti http://www.developpez.com
le 21/03/2008 à 11:11
Mais j'ai hésité entre l'avantage de simplifier la lisibilité, et de complexifier la compréhension de la grammaire Java (de moins en moins accessible)

Citation Envoyé par pseudocode  Voir le message
1. Par principe, je suis pour la séparation du type de la variable et du type de l'instance. J'irai meme jusqu'a imposer que le type d'une variable soit toujours une interface.

2. Si le but c'est la lisibilité alors le gain est vraiment minime. Autant carrément supprimer le mot clé new et faire des allocations facon "C":

Code java : Sélectionner tout
1
2
  
HashMap<String, List<String>> anagrams;

Dans l'idée de déclarer et instancier en une seule instruction j'avais aussi pensé à la syntaxe VB/LotusScript, qui a cependant ton inconvénient N°1: de ne pas utiliser d'interface:
Code : Sélectionner tout
1
2
3
4
5
6
 
// pseudo VB de LotusScript 
dim session as new Session() 
 
//transposé en Java Generics 
new HashMap<String,Person>(10) annuaire;
De toutes façon, je trouve que c'est une peu du "sucre" syntaxique,
est-ce qu'on ne pourrait pas carrément avoir un précompilateur comme en C, avec des des %Define et des typedefs, pour alléger les types trops longs à écrire?
ça remplirait finalement la même fonction.
Avatar de LeGritche LeGritche - Membre à l'essai http://www.developpez.com
le 29/03/2008 à 19:12
Humm . Je suis contre cette évol du langage. L'intérêt est vraiment mineur et ça complexifie le langage (code plus lisible mais langage plus complexe).

Pour moi, seules les évolutions vraiment utiles doivent être intégrées.
Avatar de TPReal TPReal - Membre à l'essai http://www.developpez.com
le 16/04/2008 à 21:08
Je suis d'acord avec LeGritche, l'interet est mineur, alors ne compliquons pas.
Avatar de fisico fisico - Membre régulier http://www.developpez.com
le 07/05/2008 à 11:35
contre, l'apport de l'innovation ne change pas grand chose, même rien du tout. on a pris l'habitude de travailler ainsi.
Avatar de emile.coue emile.coue - Membre à l'essai http://www.developpez.com
le 07/05/2008 à 11:59
Je suis contre, tant qu'il y a la mécanique d'autocomplétion dans la majorité des IDEs, cette forme d'instantiation ne va ajouter que de difficultés au niveau de la lisibilité du code et le rendre moins compréhensible sur tout quand elle est loin de la déclaration de la référence.
Avatar de adiGuba adiGuba - Expert éminent sénior http://www.developpez.com
le 07/05/2008 à 12:20
Citation Envoyé par emile.coue  Voir le message
cette forme d'instantiation ne va ajouter que de difficultés au niveau de la lisibilité du code et le rendre moins compréhensible sur tout quand elle est loin de la déclaration de la référence.

De la manière dont je l'ai compris, ce ne serait possible que dans le cas d'une instantiation en ligne... un peut comme pour les tableaux :

Code : Sélectionner tout
1
2
3
4
	int[] values = { 1, 2, 3, 4 }; // OK 
	 
	values = { 1, 2, 3, 4 }; // ERREUR 
	values = new int[] { 1, 2, 3, 4 }; // OK
a++
Avatar de emile.coue emile.coue - Membre à l'essai http://www.developpez.com
le 07/05/2008 à 12:28
Bonjour adiGuba,

De la manière dont je l'ai compris, ce ne serait possible que dans le cas d'une instantiation en ligne... un peut comme pour les tableaux :

Dans ce cas, je vote pour. et ça sera pratique, et le code sera moins lourd, au niveau LECTURE.

POUR
Avatar de fridobox fridobox - Membre à l'essai http://www.developpez.com
le 19/10/2008 à 11:36
Je m'explique :
L'instanciation ne suit la déclaration que dans des cas simples.
S'ils sont séparés :
Code : Sélectionner tout
1
2
3
4
 
        List<String> lst; 
        (... code ...) 
        lst = new ArrayList<>();
on est obligé de retrouver la déclaration pour connaître le type de la liste (sauf avec un puissant IDE).
Si quelqu'un doit se plonger dans du code qu'il n'a pas écrit, l'interprétation doit être sans ambiguïté.

Il faut de toute façon conserver la syntaxe actuelle lorsque le type de l'instanciation est différent du type de la déclaration :
Code : Sélectionner tout
1
2
 
        List<? extends MaSuperClass> lst = new ArrayList<MaClass>();
Avatar de adiGuba adiGuba - Expert éminent sénior http://www.developpez.com
le 19/10/2008 à 11:50
Citation Envoyé par fridobox  Voir le message
Je m'explique :
L'instanciation ne suit la déclaration que dans des cas simples.
S'ils sont séparés :
Code : Sélectionner tout
1
2
3
4
 
        List<String> lst; 
        (... code ...) 
        lst = new ArrayList<>();

Dans ce cas là la syntaxe ne serait sûrement pas possible.

C'est un peu comme la syntaxe raccourci des tableaux, où l'on peut omettre le type du tableau :
Code : Sélectionner tout
1
2
3
String[] array = { "a", "b", "c" }; 
// A la place de : 
String[] array = new String[]{ "a", "b", "c" };
Mais ce n'est possible que sur la déclaration. Si on affecte le tableau plus loin dans le code on est obligé d'utilité la syntaxe complète. Ainsi ceci ne compile pas :
Code : Sélectionner tout
1
2
3
String[] array; 
// ... 
array  = { "a", "b", "c" };
L'intérêt étant d'éviter de dupliquer l'information lorsque c'est possible (lorsqu'il y a affectation en ligne), tout en évitant les ambiguités...

a++
Avatar de fridobox fridobox - Membre à l'essai http://www.developpez.com
le 20/10/2008 à 9:50
Avec cette contrainte effectivement ça devient acceptable.

Thanks
Avatar de adiGuba adiGuba - Expert éminent sénior http://www.developpez.com
le 27/08/2009 à 19:29
C'est fait : cette proposition a été intégré dans Java 7 sous le nom de "diamond syntax".

Pour la petit histoire il s'agit de la première modification du langage de Java 7

Pour plus d'info : Première modification du langage : Diamond syntax

a++
Offres d'emploi IT
Reconversion ingénieur informatique h/f
Adaming - Nord Pas-de-Calais - France
Community manager h/f
Adaming - Ile de France - Paris (75000)
Business Manager Energie (H/F)
Alten - Ile de France - Boulogne

Voir plus d'offres Voir la carte des offres IT
Responsables bénévoles de la rubrique Java : Mickael Baron - Robin56 -