II. Java 5 vu par Nice▲
Comme cela a été dit précédemment, Nice dispose déjà des principales fonctionnalités annoncées pour Java 5. Le but des paragraphes suivants est donc d'évoquer certaines de ces fonctionnalités et de les illustrer par du code Java 5 et Nice.
II-A. La généricité▲
L'utilisation de classes génériques (ou encore nommées classes paramétrables) s'avère extrêmement utile et appréciée sur de nombreux points. En effet, le code sera plus agréable à lire et à maintenir, les risques d'erreur ou d'oubli dans les conversions puisqu'elles sont faites automatiquement. Enfin, cela favorise la réutilisation de composants, et permettra au développeur de se concentrer sur les objets métier.
Voyons sur un petit exemple (Langage sera une classe métier par exemple) à quel point la généricité peut rendre service :
Avec Java 1.4
ArrayList al =
new
ArrayList
(
);
al.add
(
new
Langage
(
"Java"
));
al.add
(
new
Langage
(
"Nice"
)); // on pourrait très bien passer un autre type d'objet à la méthode add
for
(
Iterator i =
al.iterator
(
); i.hasNext
(
);) // clause for plutôt "lourde"
{
Langage l =
(
Langage) i.next
(
);
/* on récupère l'objet avec transtypage obligatoire et risque d'erreur
si l'objet n'est pas du type Langage ... */
System.out.println
(
l); // affichage de la valeur de l.toString();
}
Avec Java 5
ArrayList<
Langage>
al =
new
ArrayList<
Langage>(
);
al.add
(
new
Langage
(
"Java"
));
al.add
(
new
Langage
(
"Nice"
)); // on ne peut plus passer d'objet d'un autre type
for
(
Iterator i =
al.iterator
(
); i.hasNext
(
);)
// nous verrons plus loin que d'autres nouveautés Java 5 vont améliorer le parcours
{
Langage l =
(
Langage) i.next
(
);
System.out.println
(
l);
}
Ce dernier code fonctionne parfaitement avec Nice, mais je vous propose dès à présent un avant-goût des possibilités de Nice sur cet exemple (l'ensemble des autres particularités sera vu au chapitre suivant).
II-B. Les optimisations▲
II-B-1. Boucle for▲
Les nouveautés de Java 5 concernent également les boucles de parcours d'ensembles (collections et tableaux). Reprenons l'exemple précédent pour illustrer cette fonctionnalité.
Avec Java 5
ArrayList<
Langage>
al =
new
ArrayList<
Langage>(
);
al.add
(
new
Langage
(
"Java"
));
al.add
(
new
Langage
(
"Nice"
));
for
(
Langage l : al)
{
System.out.println
(
l);
}
Les possibilités d'utilisation ne sont bien entendu pas limitées qu'aux collections et tableaux. Cela est possible pour toute classe implémentant l'interface Iterable.
for
(
Type Identifier : Expression) // Expression doit implémenter Iterable
Nice n'est pas en reste. Il fait même mieux qu'un opérateur for évolué, il propose la méthode foreach.
Avec Nice
ArrayList<
Langage>
al =
new
ArrayList
(
);
al.add
(
new
Langage
(
"Java"
));
al.add
(
new
Langage
(
"Nice"
));
al.foreach
(
Langage l =>
System.out.println
(
l));
Nous reviendrons plus loin sur la méthode foreach et sur les fonctionnalités qui se cachent derrière. Je vous laisse constater la puissance et la simplicité de cette méthode qui permet à la fois de parcourir un ensemble et de faire un traitement sur chaque élément.
II-B-2. L'autoboxing▲
Qui n'a jamais trouvé la conversion d'un objet d'un type enveloppe vers le type non objet correspondant (et vice versa) particulièrement lourde ? Bien heureusement, Java 5 permet de se passer de telles conversions.
Voici un petit exemple pour illustrer ceci :
Avec Java 1.4
ArrayList al =
new
ArrayList
(
);
al.add
(
0
, new
Double
(
1.4
));
double
version =
((
Double) al.get
(
0
)).doubleValue
(
);
Avec Java 5
ArrayList<
Double>
al =
new
ArrayList<
Double>(
);
al.add
(
0
,1.5
);
double
version =
al.get
(
0
);