Publié par
Il y a 6 années · 1 minute · Java / JEE

Quizz Java 8

Brian Goetz, l’architecte du langage Java chez Oracle, nous a suggéré un petit Quizz (à la TheCodersBreakfast.net ;-) ). Il fait suite à une solution que nous avons présentée dans ce blog consistant à émuler des mixins dans Java 8 grâce aux méthodes virtuelles d’extension. Le quizz ci-dessous permet de montrer un autre des dangers qui apparaîtront dans Java 8 si vous vous mettiez en tête d’utiliser cette émulation des mixins. Mais comme expliqué précédemment, surtout n’utilisez pas ce code sur vos projets ! Sérieusement, N’UTILISEZ SURTOUT PAS CE CODE SUR VOS PROJETS !

Dans le code ci-dessous, on suppose réglés les problèmes d’accès concurrents et de fuite mémoire.

public interface FakeBrokenMixin {
    static Map<FakeBrokenMixin, String> backingMap
        = Collections.synchronizedMap(new WeakHashMap<FakeBrokenMixin, String>());

    String getName() default { return backingMap.get(this); }
    void setName(String name) default { backingMap.put(this, name); }
}

public interface X extends Runnable, FakeBrokenMixin {}

public YourTestClass {
    private static X makeX() {
        return () -> { System.out.println("X"); };
    }

    public static void main(String... args) {
        X x1 = makeX();
        X x2 = makeX();
        x1.setName("x1");
        x2.setName("x2");

        System.out.println(x1.getName());
        System.out.println(x2.getName());
    }
}

Savez-vous ce qui doit s’afficher à terme dans Java 8 sachant que le code compile avec les versions actuelles de l’OpenJDK 8.

Réponse en début de semaine prochaine…

Indice : la notation ‘() -> ...‘ est une lambda expression et doit générer une instance dérivant de l’interface ou de la classe cible. Dans ce cas, la compilation s’exécute sans erreur seulement lorsque la cible n’a qu’une méthode abstraite. Le corps de la lambda expression sert à définir le corps de la méthode abstraite.

François Sarradin
Consultant Java et λ développeur. Blog personnel : http://kerflyn.wordpress.com/ Twitter : @fsarradin

2 thoughts on “Quizz Java 8”

  1. Publié par doanduyhai, Il y a 6 années

    Toute la question est de savoir si, lorsqu’on appelle makeX(), Java retourne la même instance de lambda quelque soit le nombre d’appel ou s’il crée une nouvelle instance à chaque appel…

    Dans le premier cas (même instance) on aura « x2 » affiché 2 fois.

    Dans le deuxième cas on aura « x1 » puis « x2 »

    My 2 cents

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *