mercredi 23 mai 2012

Nouveautés Guava 12


Guava 12 est sorti il y a déjà quelques semaines et j’ai enfin pris le temps de jeter un oeil aux nouveautés ! Alors, quoi de neuf ? Faisons le tour des évolutions importantes de cette nouvelle version.

JDK 6

Guava 12 nécessite désormais Java 6. Les utilisateurs étant encore sous Java 5 devront se contenter de la version précédente à savoir la 11.0.2 que j’affectionne particulièrement :)
Java 6 apporte son lot de nouveautés et l’équipe de Guava en à profiter pour faire évoluer la librairie. Trois nouvelles interfaces pour les collections y sont désormais utilisées NavigableSet,  NavigableMap et Deque.


NavigableSet / NavigableMap

Ces deux interfaces ajoutent des fonctionnalités de navigation et d’extraction de sous-ensembles aux collections triés, respectivement SortedSet et SortedMap. Voici ce qu’offre plus précisément l’interface NavigableSet, les mêmes principes se retrouvant dans NavigableMap :
  • Les méthodes lower(E), floor(E), ceiling(E), and higher(E) retournent l’élément le plus proche parmi l’ensemble respectivement inférieur, inférieur ou égal, supérieur ou égal et supérieur que l’élément passé en paramètre, null si aucun.
  • Les méthodes subSet(E, E), headSet(E), and tailSet(E) retournent les sous-ensembles des éléments respectivement compris entre, inférieur ou supérieur aux éléments passés en paramètre.
  • Les méthodes pollFirst et pollLast récupèrent et retirent respectivement le premier (le plus petit) ou le dernier (le plus grand) élément.
  • Les méthodes descendingSet et descendingIterator retournent l’ensemble dans l’ordre inverse.
L’équipe Guava ne s’est donc pas privée pour utiliser ces interfaces sur ses implémentations existantes, mais également sur de nouvelles :
  • ImmutableSortedSet
  • ImmutableSortedMap
  • ForwardingNavigableMap
  • ForwardingNavigableSet


Deque

Cette interface étend celle existante pour les files, Queue. Elle permet d’ajouter ou d’enlever des éléments aux deux bouts de la collection, à savoir au début ou à la fin. Les notions de pile et de file sont donc regroupées dans cette interface. Une nouvelle implémentation a donc été ajoutée dans Guava :
  • ForwardingDeque


FluentIterable

Voici une classe intéressante qui vient compléter la classe Iterables déjà existante. Elle permet d'enchaîner les opérations que l’on fait habituellement avec Iterables d’un seul trait. Le code devient ainsi plus clair surtout lorsque le nombre d’opérations devient important. Vérifions cette théorie par un exemple :
Méthode old school :
ImmutableList.copyOf(Iterables.limit(Iterables.transform(
    Iterables.filter(database.getClientList(), activeInLastMonth()), 
    Functions.toStringFunction()), 10));
Nouvelle méthode :
FluentIterable
    .from(database.getClientList())
    .filter(activeInLastMonth())
    .transform(Functions.toStringFunction())
    .limit(10)
    .toImmutableList();
J’ai volontairement exagéré le premier cas où j’aurais pu utiliser des imports statiques, passer par des variables intermédiaires, mais la différence de clarté en est plus évidente.
Une dernière remarque encore : Guava s’approche de plus en plus de ce qui existe dans le framework .Net avec les méthodes d’extensions de la classe Enumerable. L’équipe Guava s’inspirait-elle du framework .Net ? Pour quand la syntaxe LINQ dans Java ?
<see cref="System.Linq.Enumerable”>


Reflection

Un nouveau package apparait dans la librairie Guava, common.reflect. Il apporte des outils qui complètent la réflection en Java. Deux classes importantes y ont été créée :
  • Reflection qui propose des méthodes statiques pour la réflection.
  • TypeToken qui facilite la réflection sur les types génériques et leurs arguments. Il est possible de manipuler et requêter des types génériques, même à l’exécution.

@see Reflection explained


Nouvelles classes

Voici un rapide descriptif des autres nouvelles classes ajoutées dans cette nouvelle version :
  • CacheBuilderSpec : classe de configuration d’un CacheBuilder à partir d’une chaine de caractères parsable. A noter que cette classe n’est pas encore compatible avec GWT.
  • MediaType : classe représentant les types Mime. A noter qu’elle n’a pas pour fonction de représenter l’entête HTTP Content-Type en tant que telle.
  • HashCodes : Factory permettant de créer des instances de HashCode, des hash codes ave une taille définie.


Les points importants dans cette nouvelle version sont donc le passage à Java 6 et un début d’outil de Reflection. A part cela, il n’y a pas de révolution et pas de nouveaux concepts.


Sources :

Aucun commentaire:

Enregistrer un commentaire