Les nouveautés du JDK7 que je trouve intéressantes

Je suis en train de me plonger dans le futur ex serpent de mer et tellement attendu : jdk 7. Après quelques découpes à la machette ( expression lamda par ex ) le dernier toolkit de sun oracle arrive avec quelques nouveautés.

Je n'évoquerai sans doute pas certaines fonctionnalités qui peuvent paraître très importantes telles que celles liées à la prise en compte de la dernière version de l'unicode ou de la mise à jour de la stack XML. Je ne souhaite évoquer que ce qu'il m'a frappé en abordant cette nouvelle version.

La liberté

Et oui, il fallait bien que je parle un minimum de la licence. Le développement de JAVA est dorénavant basé sur openjdk. Ce dernier est sous licence GPLV2 C'est ce dernier qui sert de base au JDK d'Oracle et non l'inverse ( officiellement)

Le projet "coin"

Bon les nouveautés évoqués par l'éditeur inclues dans le sous projet coin me laissent froid ! Le multi catch, le "diamond operator" , la possibilité d'utiliser un string dans une opérande "switch-case" me laissent froid ou encore le try-with-resources. Je m'explique, c'est certes intéressant mais bon, il n'y a rien de passionnant . Certes, ces modifications permettent de simplifier le code et d'éviter les bêtises habituelles sur la fermeture des ressources ( et encore ...) mais, pour le temps qui a été mis pour cette spécification, ça laisse un peu circonspect . Vous allez me dire, la spécification s'appelle "Small Enhancements to the JavaTM Programming Language", le JCP ne prend personne en traître ....

Le package java.nio.file

La, je trouve qu'il y a une réelle avancée technique. Après les autres classes publiées dans ce même package dans les versions précédentes ( channel, buffer) on a désormais une grosse évolution sur la manipulation des répertoires et fichiers et ceci de manière aisée.

Pour plus de renseignements vous pouvez vous rendre sur cet article (regardez la date de l'article...) ou encore sur le tutoriel de sun d'oracle.

Pour résumer on pourra désormais FACILEMENT :*

  • accéder aux méta données d'un fichier
  • manipuler des liens symboliques et physiques
  • scanner les éventuels changement d'un répertoire
  • manipuler des chemins de fichier ( relatifs, navigation, ..)

La gestion du parallélisme

et la je ne parle pas du train avant de ma voiture... il fallait bien que je place une blague un minimum lourde :) Bon au menu du JDK7, on a maintenant la possibilité de faire des fork et autres join assez facilement.

Un exemple largement inspiré de celui trouvé dans la javadoc

Une classe faisant des additions récursives ( je sais c'est fort utile...).

voici la classe gérant la récursivité

package javaapplication3;
 
import java.util.Arrays;
import java.util.concurrent.RecursiveAction;
 
public class AddTask extends RecursiveAction {
 
    public static final int[] TABLEAU = {10, 12, 15, 89, 79, 79, 56, 90, 23, 100, 50, 89, 45, 79, 56, 79, 12, 79, 12, 79, 79, 79, 79, 79, 79, 45, 78, 40, 56, 123, 789, 3549};
    private static final int MAX_ELEMENTS_CALCUL_ADD = 2;
    private Integer addition = null;
    private int[] tab = null;
 
    public Integer getAddition() {
        return addition;
    }
 
    public void setAddition(Integer addition) {
        this.addition = addition;
    }
 
    public int[] getTab() {
        return tab;
    }
 
    public void setTab(int[] tab) {
        this.tab = tab;
    }
 
    public AddTask(Integer addition, int[] tab) {
        this.addition = addition;
        this.tab = tab;
    }
 
    @Override
    protected void compute() {
        try{
        if (getTab().length > MAX_ELEMENTS_CALCUL_ADD) {
            int to1 = Math.round(getTab().length / 2);
            int[] smalltab1 = Arrays.copyOfRange(getTab(), 0, to1);
            System.out.println("smalltab1 = " + smalltab1.length);
            int[] smalltab2 = Arrays.copyOfRange(getTab(), to1, getTab().length - 1);
            System.out.println("smalltab2 = " + smalltab2.length);
            AddTask task1 = new AddTask(getAddition(), smalltab1);
            AddTask task2 = new AddTask(getAddition(), smalltab2);
            invokeAll(task1, task2);
            setAddition(getAddition() + task1.getAddition() + task2.getAddition());
        } else {
            setAddition(getAddition() + getTab()[0]);
        }
        }catch(ArrayIndexOutOfBoundsException|Exception e){
            System.err.println(e.getMessage());
        }
    }
}

Elle hérite de la classe RecursiveAction fournie par le JDK et effectue le traitement dans la méthode compute()

Ensuite le main appelant le tout

public static void main(String[] args) {
        ForkJoinPool pool = new ForkJoinPool();
        AddTask hello1 = new AddTask(new Integer(0),AddTask.TABLEAU);
        System.out.println("avant execution");
        pool.invoke(hello1);
        System.out.println("apres execution :"+hello1.getAddition());
    }

Mark Reinhold fourni également un exemple plus frappant sur le webcast de java7 sur l'algorithme divide and conquer.

Les performances

Comme chaque nouvelle version majeure, l'éditeur apporte son lot d'amélioration des perfs. L'arrivé du Garbage Collector G1, l'amélioration de la JVM notamment sur la gestion des tas mémoires (heap) peuvent être intéressants. Des résultats très encourageants ont été publiés par Oracle. Mais bon c'est comme tout, il faut l'étudier pour voir si ça fonctionne vraiment pour une application donnée...

Pour finir

La nouvelle version du JDK apporte son lot de nouveautés/améliorations. Cependant, je ne la trouve pas réellement transcendante. A mon avis, pour s'extasier sur des réelles nouveautés (Date API, closures, modules,...) , il va falloir attendre la version 8.

Vus : 1127
Publié par Littlewing : 368