85 votes

Quelle est la meilleure approche pour utiliser une Enum comme singleton en Java ?

En s'appuyant sur ce qui a été écrit dans la question SO Meilleure implémentation de singleton en Java - à savoir l'utilisation d'un enum pour créer un singleton - quelles sont les différences/pros/cons entre (constructeur omis)

public enum Elvis {
    INSTANCE;
    private int age;

    public int getAge() {
        return age;
    }
}

et ensuite appeler Elvis.INSTANCE.getAge()

y

public enum Elvis {
    INSTANCE;
    private int age;

    public static int getAge() {
        return INSTANCE.age;
    }
}

et ensuite appeler Elvis.getAge()

95voto

Jon Skeet Points 692016

Supposons que vous soyez lié à quelque chose qui utilisera les propriétés de n'importe quel objet qui lui est donné - vous pouvez passer Elvis.INSTANCE très facilement, mais vous ne pouvez pas passer Elvis.class et vous attendre à ce qu'il trouve la propriété (à moins qu'il soit délibérément codé pour trouver les propriétés statiques des classes).

Fondamentalement, vous n'utilisez le modèle singleton que lorsque vous quiere un exemple. Si les méthodes statiques vous conviennent, utilisez-les et ne vous souciez pas de l'enum.

68voto

Nicolas Points 11558

Un grand avantage est lorsque votre singleton doit implémenter une interface. En suivant votre exemple :

public enum Elvis implements HasAge {
    INSTANCE;
    private int age;

    @Override
    public int getAge() {
        return age;
    }
}

Avec :

public interface HasAge {
    public int getAge();
}

On ne peut pas le faire avec les statiques...

9voto

(Stateful) Les singletons sont généralement utilisés pour prétendre ne pas utiliser de variables statiques. Si vous n'utilisez pas réellement la variable statique publique, vous tromperez moins de personnes.

8voto

Peter Lawrey Points 229686

Je choisirais l'option la plus simple et la plus claire. C'est un peu subjectif, mais si vous ne savez pas ce qui est le plus clair, choisissez simplement l'option la plus courte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X