web-dev-qa-db-fra.com

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

S'appuyant sur ce qui a été écrit en SO question Meilleure implémentation de singleton en Java - à savoir sur l'utilisation d'une énumération pour créer un singleton - quelles sont les différences/avantages/inconvénients entre (constructeur omis)

public enum Elvis {
    INSTANCE;
    private int age;

    public int getAge() {
        return age;
    }
}

puis en appelant Elvis.INSTANCE.getAge()

et

public enum Elvis {
    INSTANCE;
    private int age;

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

puis en appelant Elvis.getAge()

85
Miles D

Supposons que vous vous liez à quelque chose qui utilisera les propriétés de tout 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 ne soit délibérément codé pour trouver propriétés statiques des classes).

Fondamentalement, vous n'utilisez le modèle singleton que lorsque vous voulez une instance. Si les méthodes statiques vous conviennent, alors utilisez-les et ne vous embêtez pas avec l'énumération.

95
Jon Skeet

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();
}

Cela ne peut pas être fait avec la statique ...

68
Nicolas

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

9

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

8
Peter Lawrey