TreeSet / TreeMap : petit changement en Java 7

Jusqu'à Java 6 inclus, TreeMap et TreeSet avaient un comportement rigolo, pouvant fournir matière à quiz ou question d'entretien technique.

A votre avis, que fait ce bout de code ?

TreeSet set = new TreeSet();
set.add(new Object());
set.add(new Object());
System.out.println(set.size());

A l'exécution, on obtient une ClassCastException... à la ligne 3.
C'est-à-dire l'insertion du premier objet se passe bien, mais que la seconde provoque une exception.

La raison en est simple : un TreeSet (ou une TreeMap) étant implémenté sous forme d'arbre binaire, il doit comparer les objets entre eux pour les organiser. Or, nous voyons dans le code que les objets insérés n'implémentent pas Comparable, et qu'aucun Comparator n'est fourni au TreeSet.

Le premier objet étant... le premier justement, et donc le seul dans la structure, aucune comparaison n'est effectuée : il devient simplement la racine de l'arbre. A partir du second objet, une comparaison devient nécessaire, et les objets sont donc "castés" en Comparable... ce qui provoque une ClassCastException.

Funky, mais logique, quelque part.

Et bien, tout ceci est fini en Java 7 : on obtient une exception dès la première insertion.
C'est moins drôle, mais ce nouveau comportement est sans doute plus sain. On ne s'en plaindra donc pas.

Et puis, maintenant vous avez une nouvelle anecdote pour épater les convives dans les dîners mondains :)

Structures de données : les Arbres de Fenwick

Si je vous demande de me citer des structures de données, vous répondrez sans doute : les tableaux, les listes chaînées, les Maps, les Sets, voire les arbres binaires... Ces structures sont simples et d'un usage courant, et suffisent pour la plupart de nos besoins.

Dans certain cas toutefois, les structures basiques atteignent leurs limites, et il est nécessaire de recourir à des structures spécialisées. Aujourd'hui, je vous présente les Arbres de Fenwick.

Lire la suite...

Du micro-BDD avec les labels

Vous connaissez le "Behavior-Driven Development" (BDD) ?
C'est une méthode de spécification et de test, qui consiste à décrire des scénarios sous la forme de triplets "conditions initiales" / "action" / "résultat attendu" (Given... / When... / Then...).

Différents frameworks (Cucumber, EasyB, JNario...) facilitent la mise en place de ce pattern en proposant notamment une syntaxe spécifique (DSL), et offrent de nombreuses fonctionnalités fort pratiques.

Mais si seule la formalisation "Given / When / Then" vous intéresse dans vos tests unitaires, il suffit d'utiliser... les labels Java.

Lire la suite...

P6Spy, l'espion qui m'aidait

Hibernate est un bon outil, mais complexe. Pour surveiller les requêtes qu'il envoie à la base de données, il est possible d'activer différentes options :

hibernate.show_sql         = true
hibernate.format_sql       = true
hibernate.use_sql_comments = true

Mais les traces ainsi produites ne sont pas vraiment satisfaisantes : on voit bien la structure des statements, mais pas les véritables valeurs des paramètres :

Hibernate: 
    insert 
        into
            VILLE
            (version, nom, PAYS_ID, ID) 
        values
            (?, ?, ?, ?)

On sent bien qu'Hibernate a fait de son mieux pour nous aider, qu'une petite goutte de sueur a ruisselé sur son front fiévreux au cours de l'effort, mais tout de même, le résultat est loin d'être satisfaisant.

Et c'est là que P6Spy intervient.

Lire la suite...

Développer une application REST avec Spring MVC & Angular.js

Aujourd'hui plus que jamais, le Javascript a le vent en poupe. On le trouve même côté serveur - ce que je trouve personnellement d'une absurdité étourdissante, mais passons.

En ce moment, la mode est aux frameworks MVC côté client ; là, j'y crois déjà un peu plus. Mais il en sort environ un par semaine, et il est difficile de faire son choix, malgré la pléthore de comparatifs qui fleurissent sur le net (ici, , ou encore là-bas).

Thoughtworks, de son côté, estime que la peinture n'est pas encore sèche et qu'il vaut mieux attendre un peu avant de se lancer dans ce genre d'aventure en production. En effet, on a encore très peu de retours d'expérience, et la pérennité des frameworks n'est pas encore démontrée.

Pourtant, dans le tas, il y en a un qui m'a fait de l'oeil : Angular.js. Je vous propose donc une petite démonstration de son intégration avec Spring MVC côté serveur, pour réaliser une application, totalement originale n'est-ce pas, de "todo-list".

Lire la suite...

Google TV : another brick in the wall ?

La semaine dernière, Zenika organisait la première zNight, un événement ouvert à tous, qui permet à des équipes de coder toute la nuit autour d'un sujet imposé.
Malgré l'exiguïté des locaux (mais ça devrait aller mieux bientôt), l'organisation était impeccable, et nous avons pu accueillir une quarantaine de personnes dans une joyeuse ambiance geek/pizza/bonbons.

A événement exceptionnel, sujet exceptionnel : la Google TV, qui devrait débarquer bientôt dans nos contrées.

Un représentant de Google était présent pour nous présenter la bête et nous expliquer, des étoiles dans les yeux, à quel point cela allait changer la façon dont nous regardons la télévision. Personnellement, je n'ai pas ce type d'écran à la maison, mais j'étais curieux de voir ce qu'on pouvait en tirer.

Lire la suite...

Java 8 et les Lambda

La prochaine version de Java, prévue pour 2013, apportera le lot de nouveautés le plus important depuis Java 5 : expressions lambda, "public defender methods", références de fonctions...

Aujourd'hui, je vous propose de découvrir la nature, la syntaxe et les cas d'utilisation des expressions lambda (une forme de "closure"), ainsi que leur impact sur notre façon de coder.

(Cet article est également publié sur le blog Zenika).

Lire la suite...

Setting final fields like a boss

I've been playing recently with final fields, while working on my serialization library, Seren. And I've found a surprising, funny thing about them. You wouldn't believe. It's astonishing ! (tease, tease)

Lire la suite...

Les specs de Java 7 disponibles

java.gifUn petit billet en forme de pense-bête, pour vous signaler la disponibilité de la Java Language Specification v7 (JLS7 pour les intimes ou les insomniaques). et de la JVM Specification v7.

On notera que ces JLS7 et JVMS7 font suite aux... JLS4 et JVMS3, ce qui ne laisse pas d'étonner, mais après tout, la numérotation de Java itself a gaillardement sauté quelques étapes entre la 1.4 et la 5.0... Les curieux pourront se reporter aux explications d'Alex Buckley sur le sujet.

Au coeur du JDK : java.io expliqué simplement

Je suis surpris par le nombre de développeurs qui s'avouent intimidés par le package java.io. Il est vrai qu'il contient beaucoup de classes, dont la plupart portent des noms très similaires, mais nous allons voir que son architecture est en réalité très simple.

Il suffit de comprendre deux concepts pour y voir tout de suite plus clair : le schéma en 4 quadrants, et le pattern Decorator. Le premier permet de déterminer à quoi sert une classe ; le second indique son rôle dans la chaîne de lecture ou d'écriture des données.

Suivez le guide !

Lire la suite...

- page 3 de 11 -