Java 7 & 8 : Retours du Jug de Toulouse

  • Sharebar

Mercredi 14 septembre 2011 a eu lieu une présentation de Java 7 par Terrence Barr lors du Toulouse Jug.

Java 7

Quelles sont les nouveautés apportées de cette version ?

Au niveau langage — “Project Coin”

L’underscore _ peut à présent être utilisé dans la représentation des nombres pour simplifier la lecture. Par exemple au lieu d’écrire :

int i = 1000000;

vous pouvez à présent écrire :

int i = 1_000_000;

Cette notation est valable pour n’importe quel nombre de n’importe quel format (binaire, hexa, …)

Depuis le temps que ça manquait, enfin c’est arrivé : on peut faire un switch sur une String !

Les generics ? ouais ok c’est bien mais la notation peut être assez lourdingue parfois du style :

Map<String, List<String>> myMap = new HashMap<String, List<String>>();

Dans la ligne précédente, on écrit 2 fois le typage “<String, List<String>>” ce qui rajoute de la lourdeur. C’est là que l’opérateur magique portant le doux nom de “diamant” fait son apparition. En effet, en java 7, le compilateur est devenu un peu plus intelligent et va savoir deviner le typage à appliquer en ne l’écrivant qu’une seule fois. Ce qui nous donne :

Map<String, List<String>> myMap = new HashMap<>();

Qui n’a jamais manipulé des fichiers en Java ? Vous vous êtes sûrement aperçu de la lourdeur des exceptions à traiter, d’autant plus qu’il faut bien penser à libérer les ressources (fermer les fichiers dans mon cas) au cas où il se passerait quoique ce soit. Donc vous utilisez des try/finally mais dans le finally, lors de l’appel du close() il vous faut l’encapsuler dans un nouveau try/finally …

C’est à présent de l’histoire ancienne avec le concept des ressources AutoCloseable. Il suffit par exemple d’écrire :

try (BufferedReader br = new BufferedReader(new FileReader(path)))
{
    return br.readLine();
}

La nouveauté est que le mot clé “try” prend en paramètre l’instanciation des variables AutoCloseable pour lesquelles le compilateur se chargera de générer les finally nécessaires.

Souvent lors de la gestion des exceptions, vous vous êtes retrouvés obligés d’implémenter plusieurs catch tout simplement car vous vouliez nommer les exceptions à catcher mais pourtant vous vouliez faire le même traitement. Aujourd’hui avec l’opérateur | il est possible de catcher plusieurs types d’exception dans le même bloc catch en écrivant par exemple :

catch (IOException|SQLException ex)
{
    logger.log(ex);
    throw ex;
}

Au niveau Libraries

Diverses optimisations sur les performances et l’introduction d’une classe Path permettant de manipuler beaucoup plus facilement les chemins.

Egalement l’introduction de la classe DirectoryStream permettant de récupérer la liste des fichiers d’un répertoire réseau ou distant en commençant le traitement dès le début de la réception plutôt que d’attendre l’envoi complet du listing du répertoire.

J’ai noté également la classe FileSystem permettant de gérer différent systèmes de fichier (NFS, FAT, Zip Archive, …). Zip permet donc de traiter le contenu d’un zip comme si c’était sur un disque … sympa.

Terrence nous a expliqué l’utilité du Fork/Join qui, aujourd’hui avec l’avènement des processeurs multi-coeurs prend tout son sens. En effet, en utilisant le principe des RecursiveTask, il est possible de coder des classes qui pourront être parallélisées sur l’OS. La spécification de la JVM ne définit pas comment ce sera parallélisé, il suffit juste de savoir que ce sera parallélisé. Attention cependant à ces tâches qui ne doivent pas manipuler les mêmes données au risque d’avoir les mêmes problèmes que dans tout traitement parallèle. Ces RecursiveTask s’exécutent dans un ForkJoinPool qui a la charge de gérer l’exécution.

Une évolution du Nimbus Look&Feel

L’introduction de la classe JLayer pour mettre en place un grisage de l’arrière plan dans l’IHM.

DaVinci Machine

C’est un des points un peu ardu de la présentation. La JVM peut accueillir des langages dynamiques (Groovy, Javascript, …). Dans Java 7, avec l’introduction du invokeDynamic, les performances d’exécution de ces langages se voient fortement améliorées (jusqu’à x10).

Java 8

Project JigSaw

afin de modulariser la plateforme Java, dans Java 8 il y aura la possibilité de définir des “modules”. Chaque module pourra définir :

  • ses dépendances runtime vers d’autres modules (avec numéro de version) ,
  • les modules qu’il fournit et en quelle version

L’objectif étant qu’à l’exécution, la machine virtuelle Java ne charge uniquement que les modules dont elle a besoin et optimise donc les temps de chargement et exécution.

Project Lambda Expression

Un autre point compliqué de la présentation (il n’y a qu’à voir le nombre de question qui ont été posées !), c’est l’implémentation des lambda expression. Je ne suis pas très familier avec ces lambda expression mais il semble que ça permette une écriture simplifiée dans certains cas de parcours de collection. L’exemple donné par Terence est le suivant :

double max = students.filter(#{Student s -> s.gradYear == 2010})
                     .map(#{Student s -> s.score})
                     .max();

Pour résumer, l’utilisation du pattern #{} permet d’exprimer des expressions de filtrage ou de parcours qui simplifient l’écriture et permet d’éviter l’écriture de boucles de filtrage. Les connaisseurs apprécieront …

La sortie de Java 8 est prévue pour le deuxième semestre de 2012

Merci beaucoup à Terrence et Oracle pour la présentation et merci également au JUG de Toulouse pour l’organisation !

Catching Multiple Exception

This entry was posted in Divers and tagged , , , . Bookmark the permalink.

One Response to Java 7 & 8 : Retours du Jug de Toulouse

  1. Pingback: Pourquoi C# plutôt que Java | Blog de JP Gouigoux

Leave a Reply