Dlaczego Enum jest najlepszą implementacją dla Singleton

Przeczytałem Effective Java i tam jest napisane, że Singleton jest najlepiej zaimplementowany przy użyciu Enum.

To podejście jest funkcjonalnie równoważne z podejściem public field, z tym że jest bardziej zwięzłe, zapewnia maszynerię serializacji za darmo i zapewnia żelazną gwarancję przed wieloma instancjami, nawet w obliczu wyrafinowanych ataków serializacji lub odbicia. Chociaż podejście to nie zostało jeszcze szeroko przyjęte, najlepszym rozwiązaniem jest Jednoelementowy typ enum sposób na wdrożenie Singletona.

Mimo to wydaje się to kompromisem, aby osiągnąć serializację w locie i prawdziwą pojedynczą instancję, ale tracisz bardziej przyjazne podejście oop klasycznego Singletona. Enum nie może być dziedziczone, może rozszerzać tylko interfejs i jeśli chcesz zapewnić klasę szkieletową, musisz utworzyć klasę pomocniczą.

Dlaczego więc mamy przyjąć Enum jako najlepszą implementację dla Singletona, poza wymienionymi powyżej powodami?

Author: assylias, 2012-08-06

3 answers

To wygląda na kompromis, aby osiągnąć serializację w locie.]}

Dla mnie jest o wiele prostsze i bardziej zwięzłe napisać coś w rodzaju

enum Singleton {
    INSTANCE;
}

Jeśli masz potrzebę napisania dużo więcej kodu lub wprowadzenia złożoności to zrób to, ale rzadko jest to wymagane IMHO.

Tracisz bardziej przyjazne podejście oop klasycznego Singletona.

Uważam używanie pól za prostsze.

Enum nie może być dziedziczone,

True, ale posiadanie wielu singletonów jest podejrzane samo w sobie. Enums może dziedziczyć po interfejsach, co pozwala na zamianę jednej implementacji na inną.

Jeśli chcesz zapewnić klasę szkieletową, musisz utworzyć klasę pomocniczą

Klasa pomocnicza nie ma żadnego stanu. Klasa szkieletowa może mieć jakiś stan, w którym to przypadku potrzebujesz delegacji.

BTW: możesz użyć enum dla klas pomocniczych

enum Helper {;
    public static my_static_methods_here;
}

Dlaczego mamy przyjąć Enum jako najlepsze implementacja dla Singleton

Przestrzegałbym YAGNI Zasady. Rozwijaj tylko to, czego potrzebujesz, a nie to, co sobie wyobrażasz.

 15
Author: Peter Lawrey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-06 16:38:22

Enum can't be inherited

Jedną z najlepszych części enum jest singleton.

Jeśli możesz dziedziczyć singleton, to już nie jest singleton.

 16
Author: dantuch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-06 21:03:46

W stackoverflow jakiś czas temu odbyła się podobna dyskusja: Jaki jest skuteczny sposób implementacji wzorca Singletona w Javie?

Zaakceptowana odpowiedź zapewnia dobre linki na ten temat:

Joshua Bloch wyjaśnił to podejście w swoim Effective Java Reloaded dyskusja w Google I/O 2008: link Do Wideo. Zobacz też slajdy 30-32 jego prezentacji (effective_java_readed.pdf):

Najważniejsze jest to, że jest ciężko napisać singleton, który jest prawdziwym singletonem. Wartości Enum są gwarantowane tylko raz.

 10
Author: Stefan Ferstl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:16:57