Nouveautés Java 7 – Dolphin
March 17, 2008
Il n’y à toujours pas de JSR officiel décrivant l’ensemble des nouvelles fonctionnalités de Java 7. Cette dernière version porte toujours le nom d’un animal : Dolphin.
Pour cette nouvelle version il devrait y avoir des évolutions dans le langages Java, un nouveau format d’archive (remplaçant du fichier jar) : Java Module System (JSR 277), de nouvelles API et des améliorations de la JVM (support natif de language de script : Javascript, Ruby, PHP).
Nouveautés du langage
- Support natif du XML :
Un exemple vaut mieux que plusieurs lignes d’explications :
Document d = <collection></collection>;
element.appendChild ();
- Propriétés JavaBeans :
Possibilité de définir un membre d’une classe en tant que propriété : les accesseurs seront alors générés à la compilation. Actuellement la syntaxe permettant d’accèder aux accesseurs n’est pas encore certaines : ., =>, -<, #.
public class MyObject {
private property String member;
}
...
MyObject obj = new MyObject ();
obj.member = "NewValue"; // setMember
String str = obj=>member; // getMember
obj->member = "New Value"; // setMember
str = obj#member; // getMember
- Redéfinition des opérateurs :
Le langage permettrait alors de redéfinir les opérateurs grâce à des annotations.
String str = "first";
switch (str) {
case "first": doThis (); break;
case "second": doThat (); break;
default: throw new IllegalArgumentException ("Unknown: " + str);
}
Autre exemple avec les énumérations :
enum MyColor {
EMPTY,
BLACK, WHITE,
RED, YELLOW, BLUE,
PINK, PURPLE, ORANGE, GREY;
}
public boolean isPrimary (MyColor c) {
return c >= MyColor.RED && c < = MyColor.BLUE;
}
- Chaînage des appels de méthodes :
class MyObject {
void doSomething () { ... }
void doOther () { ... }
boolean validate () { ... }
}
MyObjet myObject = new MyObject ();
boolean validate = myObject.doSomething ().doOther ().validate ();
- Amélioration des blocs catch :
try {
doSomething ();
} catch (IllegalStateException | IllegalAccessException e) {
// Traitement de l'exception...
}
try {
doOther (); // Lance des types différences d'exceptions
} catch (final Throwable t) {
throw t; // Lance les mêmes types d'exceptions
}
- Gestion automatique des ressources : les ressources qui sont initialisées dans un bloc sont automatiquement nettoyées à la fin du bloc. Le bloc finally n’est alors plus nécessaire.
- Simplification des templates et des List/Map :
Map<string , Object> myMap = new HashMap<> ();
List</string><string> list = new ArrayList<> ();
list.add[0] = "First";
list.add[1] = "Second";
</string>
- Les Closures (ou méthodes anonymes) :
// Sans Closures :
lock.lock ();
try {
++counter;
} finally {
lock.unlock ();
}
// Avec Closures :
withLock (lock) {
++counter;
}
public static <t> T withLock (Lock lock, {=> T throws E}) block) throws E {
lock.lock ();
try {
// Exécution du 'bloc' de code block
return block.invoke ();
} finally {
lock.unlock ();
}
}
</t>
Modularité
- Gestion des Super packages.
- JAva Module System : remplaçant du fichier JAR (Java ARchive) : gestion des versions, des dépendances, …
Gestion du versionning
Lorsque l’on développe une application, celle ci à généralement besoins d’une ou plusieurs librairies de classes. Cependant si cette librairie ne peut être fourni avec l’application (problème de license) ou qu’une version spécifique est nécessaire, il n’y à actuellement aucun moyen simple de vérifier la librairie. Les fichiers JAM vont permettrent ceci grâce à une gestion avancée du versionning :
major[.minor[.micro[.update]]][-qualifier]
Par exemple :
1+ | Version 1 ou supérieur | (1 < = x) | </td>
1.5+ | Version 1.5 ou supérieur | (1.5 < = x) | </td>
1.5.2+ | Version 1.5.2 ou supérieur | (1.5.2 < = x) | </td>
1* | Toutes les versions de la branche 1. | (1 < = x < 2) | </td>
1.5* | Toutes les versions de la branche 1.5. | (1.5 < = x < 1.6) | </td>
1.5.2* | Toutes les versions de la branche 1.5.2. | (1.5.2 < = x < 1.5.3) | </td>
1.[5+] | Version 1.5 ou supérieur dans la branche 1. | (1.5 < = x < 2) | </td>
1.5.[2+] | Version 1.5.2 ou supérieur dans la branche 1.5. | (1.5.2 < = x < 1.6) | </td>
1.[5.2+] | Version 1.5.2 ou supérieur dans la branche 1. | (1.5.2 < = x < 2) | </td>
Modules
Un fichier JAM est en fait une simple archive (tout comme le fichier JAR) qui peut contenir d’autres JAR (les modules), des ressources (images, …), du code natif (nouvelle gestion : /META-INF/bin/</p>
Chaque application aura une bibliothèque de modules (locaux ou distants) permettant la recherche, le chargement (au démarrage ou à l’exécution).
Exemple :
// Déclaration du superpackage : @Version("1.0") superpackage com.site.pack { // Import de modules @VersionConstraint("1.0+") import com.site.name; @VersionConstraint("1.5*") import com.site.xml; // Liste des packages member package com.site.pack, com.site.pack.impl; // Types exportés export com.site.pack.*; }
Nouvelles API
- NIO 2 : gestion avancée du système de fichiers (permissions, attributs de fichier), API I/O asynchrone pour les sockets et fichiers.
- JSR 275 (gestion des unités, ex: Km, m, cm, …) : expression d’une valeur dans plusieurs unités, conversion d’unités, parsing des unités dans une String.
- JSR 310 (date and time API) : amélioration de l’API actuelle afin de permettre de gérer des durées, des intervalles.
- JSR 166y : amélioration de la concurrence.
- JSR 225 : Xquery API for Java.
- JSR 284 : gestion de la consommation des ressources (CPU, mémoire, connexions JDBC, …).
- JSR 308 : annotations sur les types Java.
- JSR 260 (amélioration de la Javadoc) : tri des méthodes et champs en fonction de leur utilité, un index sémantique, distinction des méthodes/objets static, factory, deprecated, distinction des méthodes de propriétés (accesseurs), ajout d’exemples d’utilisation des méthodes.
- JSR 296 (framework pour Swing) : sauvegarde de l’état entre chaque session, gestion simplifiée des actions (arrière-plan), génération des textes dans des fichiers .properties (localisation).
- JSR 303 : validation des Beans (contraintes de schéma de base de données, du niveau business/service, du niveau présentation, du côté client).
- JSR 295 : liaison des Beans.
JVM
- Amélioration du byte-code (gestion dynamique) afin de supporter des langages de scripts : Javascript, PHP, Ruby.
- Modification du Garbage Collector : plus de gestion d’ancienne et nouvelle génération.
Article écrit à partir de : Xebia.