Le but de ce billet est de fournir un retour d’expérience sur Java 7, que j’utilise sur mon projet actuel. Il aura fallu attendre 5 ans avant la sortie de cette version majeure qui apporte de nouvelles fonctionnalités. Il serait dommage de ne pas l’utiliser !

Les nouvelles fonctionnalités

Voici celles que j’utilise et que trouve très pratiques :

  • try-with-resources qui permet de fermer automatiquement les ressources.
  • catch multiple qui permet d’avoir d’attraper plusieurs exceptions dans un seul bloc catch.
  • diamond operator qui permet d’omettre la déclaration des types génériques, le compilateur réalisant de l’inférence de type.
  • java.nio.file.Path qui remplace avantageusement la classe File en offrant une API plus riche.
  • java.util.Objects qui est une classe utilitaire (étonnamment ressemblante avec la classe Objects de guava) fournissant des méthodes de base pour travailler avec des Object : equals, hashCode, toString. À noter, Eclipse 3.7 ne tire pas partie de ces méthodes lors de la génération des méthodes equals et hashCode.

Une incompatibilité avec Surefire

J’ai rencontré l’erreur suivante : java.lang.VerifyError: Expecting a stackmap frame at branch target. Heureusement, il est possible de contourner en passant l’argument -XX:-UseSplitVerifier à la JVM. Voici la configuration pour les utilisateurs de Maven :

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.12</version>
    <configuration>
        <argLine>-XX:-UseSplitVerifier</argLine>
        <skipTests>false</skipTests>
    </configuration>
</plugin>

Des faux positifs dans Sonar

Nous utilisons Sonar 2.13 et les nouveautés du langage provoque des faux positifs : l’instruction try-with-resource provoque une violation Inner Assignement dans Checkstyle.