Pozycja 3 w Josh Block Efektywna Java (Egzekwowanie właściwości Singleton przy użyciu prywatnego konstruktora lub modułu wyliczającego) wspomina, że "Chociaż to podejście nie zostało jeszcze powszechnie przyjęte, jednoelementowy typ wyliczeniowy jest najlepszym sposobem wdrożenia singel."Czy jednolity element typu Enum Singleton jest powszechnie przyjętym dobrym pomysłem?
Przykład:
public enum Elvis {
INSTANCE;
private final String[] favoriteSongs =
{ "Hound Dog", "Heartbreak Hotel" };
public void printFavorites() {
System.out.println(Arrays.toString(favoriteSongs));
}
}
dalej: „Takie podejście jest funkcjonalnym odpowiednikiem podejścia polu publicznym, z wyjątkiem, że jest bardziej zwięzły, zapewnia maszynerię serializacji za darmo i stanowi żelazną gwarancję przeciwko stwardnieniu instancji, nawet w obliczu wyrafinowanych ataków serializacji lub refleksji. "
Największym minusem, jaki widzę, jest: czy nazwy nie mają być zmienne? Wydaje się, że często używa się Singleton ze stanem.
Czy ten wzór rzeczywiście stał się bardziej powszechny od daty publikacji (wydanie drugie opublikowane w 2008 r.)?
Czy jestem jedyną osobą, która czuje się niekomfortowo, jak wyliczanka w języku Java może zachowywać się jak zajęcia? Wygląda na to, że Java postanowiła pozbyć się "naturalnie wyglądających typów", które można zrobić w C++, przez przeciążanie metod, i zamieniła proste wyliczenia w tę dziwną plamę. – Uri
C++ podejścia wylicza jako rozszerzenie użycia ints do przełączania, więc są one bardzo proste konstrukcje. Z drugiej strony w języku Java wyliczenia są pomyślane jako legalne klasy z całą funkcjonalnością, która się z nimi wiąże, różniące się tylko jednym (głównym) ograniczeniem tworzenia. Mają tę samą nazwę, ponieważ ich zastosowania nakładają się na pewne ważne obszary, ale uważaj na zbyt bliskie ich porównywanie - są to bardzo różne bestie. – tlayton
@Uri, 'enum's w Javie nie tylko zachowują się jak klasy, one _ są_ klasami. Wszystkie one domyślnie rozszerzają 'java.lang.Enum'. – Pops