2009-02-12 19 views
5

Zgodnie z projektem stała wyliczeniowa w java jest singletonem, a ze względu na równoczesne użycie normalnie tworzę instancje instancje bezstanowe i stosuję parametry metody do wstrzykiwania danych w razie potrzeby.Czy obiekty enum powinny być bezpaństwowcami?

Przykład:

Obecnie tworzę usługi REST, która prowadzi działalność (zaimplementowany jako enum przy użyciu wariant wzorca strategii).

public enum Operation { 

    DO_THIS() { 
    public Result doSomething(Object theData) { 
    } 
    } , 
    // Other Operations go here 
    ; 

    public abstract Result doSomething(Object theData); 

} 

Teraz chcę zebrać dane o tym, jak często operacja została wywołana i jak często się to powiodło i tym podobne.

Mogłem zapisać stan zewnętrznie podczas korzystania z instancji wyliczenia, ale wydaje się raczej, że stan powinien być zapisany w operacji, ponieważ operacja powinna zawierać własny stan.

Teraz moje ogólne pytanie brzmi:

Czy Stateful instancji enum (oprócz z kwestiami współbieżności) złej konstrukcji?

+0

bez pytania, tak. – user924272

Odpowiedz

18

Myślę, że narusza to zasadę najmniejszego zdziwienia.

Ludzie oczekują wspólnego użycia wyrażeń tak jak były pierwotnie projektowane - jako stałych lub tokenów, a nie jako klas ogólnego przeznaczenia ze stanem.

+0

W przeciwieństwie do tego, że członkowie enum są rzeczywiście pierwszymi obiektami instancji java, jako że mogą mieć metody i zmienne. Może więc cały projekt enum może być wadliwy? – dhiller

+0

Myślę, że powodem, dla którego projektanci Javy używali klas dla Enums, jest to, że pozwalają na unikalność odwołań (innymi słowy, == działałoby). Idealnym scenariuszem byłoby użycie czegoś takiego jak "symbole", ale wtedy potrzebowaliby wsparcia JVM i są zbyt wielkimi zmianami. – mparaz

+1

@mparaz: nie projektanci Java wykonali wyliczenia takie jak klasy, aby umożliwić im zachowanie, które jest o jedynej funkcji językowej z Javy, której brakuje mi w języku C#. Kontrole z zachowaniem są niesamowite. – cletus

1

Wydaje się, że jest to niewłaściwy użytek do wyliczenia - dlaczego nie po prostu iść z podstawową klasą abstrakcyjną z nową podklasą dla każdej operacji?

+0

ponieważ operacja jako taka jest naprawiona, konwersja do typu operacji i użycie fabryki wydaje mi się zbyt dużym obciążeniem dla mnie ... – dhiller

+0

Myślę, że możesz przedwcześnie optymalizować - nie ma nic złego w korzystaniu z fabryki, a w rzeczywistości zrobisz Twój kod znacznie łatwiej przetestować. –

7

Tak. I przez "tak" mam na myśli "Zawsze".

Jeśli chcesz zestawiać statystyki dotyczące liczby wywoływanych operacji, zaimplementuj obserwowalność.

+0

Zastanowię się nad tym. W tej chwili moim pomysłem byłoby dodanie instancji StateContainer do sygnatury metody ... – dhiller

+0

+1 do części dającej się obserwować odpowiedzi. – Chii

+0

Trzymaj się. Jeśli dodasz obserwowalność do wyliczenia, właśnie go ustawiłeś! –

4

Każda forma zmiennego statycznego jest grzechem. (Cóż, możesz uciec z nieszczelnymi pamięciami podręcznymi, leniwą inicjalizacją i formami logowania.)

1

Całkowicie zgadzam się z mparazem, że narusza zasadę najmniejszego zdziwienia. Ludzie oczekują, że wyrazy są stałe.

Można niemal na pewno działa okrągły rzeczy logowania, za coś takiego:

DO_THIS() { 
    public Result doSomething(Object theData) { 
    MyUtilClass.doSomething(Object theData); 
    } 
} 

rejestrowanie i umieścić w drugiej klasie.

JEDNAK, jeśli nie możesz tego obejść, zasada najmniejszego zdziwienia jest wytyczną; możesz go naruszyć ZARABIAJ, że dajesz użytkownikom klasy wystarczająco ostrzeżenia o tym, co się dzieje. Upewnij się, że deklaracja enum zawiera dużą informację, że jest zmienna i dokładnie opisuje, na czym polega zmienność. Enum powinno nadal działać; wykonuje porównanie porównawcze z pojedynczą instancją, aby przetestować wartości wyliczeniowe.

10

Kociak umiera za każdym razem, gdy tworzy się wymuszone wyliczenie. Uratuj kotki!

+0

Przynajmniej uratowaliśmy uczciwą grupę, po tym, jak wymusiliśmy ostateczne wyliczenia ... – Whimusical

+2

Odpowiedź jest nie do przyjęcia w obecnej formie. Proszę podać dowody coraborative i empiryczne! – user924272

4

Wyliczenie stanowe to oksymoron, a nawet anty-wzór!

http://en.wikipedia.org/wiki/Enumeration

Wyliczenie to zbiór elementów, które jest kompletnym, nakazał listę wszystkich elementów w tej kolekcji. Termin ten jest powszechnie używany w matematyce i informatyce teoretycznej, aby odnosić się do listy wszystkich elementów zbioru. W statystykach używany jest termin kategoryczna zmienna, a nie wyliczanie. Dokładne wymagania dotyczące wyliczenia (na przykład, czy zbiór musi być skończony, czy też lista może zawierać powtórzenia) zależą od dziedziny matematyki i kontekstu, w którym się pracuje.

Wyliczenia mają skończoną liczbę wartości, które powinny być stałe, którymi są.

Jednak fakt, że są one "pierwszorzędnymi" obiektami Java, jest całkowicie sprzeczny z intencją lub duchem wyliczenia.

Jeśli wymagany jest jakikolwiek stan, wyliczenie (jak wspomniano wcześniej) powinno zawierać stan w aspekcie lub wyłudzającym wyliczeniu, powinno to, co najmniej w praktyce, zawierać odniesienie do stanu posiadania klasy delegatów. Pomocne będzie zrozumienie "rozdzielenia spraw".

0

Istnieje przypadek, który prawdopodobnie to uzasadnił. Wyliczenie może zaimplementować interfejs, zwykle z myślą o konkretnym przypadku użycia, który pozwala tworzyć dynamicznie/w sposób "inny typ klasy enum" w sposób rutynowy/jawnie "niektóre inne typy klasy wyliczeniowej", aby w końcu ją nazwać.

Oznacza to, że instancje typu "singleton" mogą być zmuszane do implementacji sygnatur metod, które można zmodyfikować (jako setery), które oczywiście można ukryć przy użyciu pustego kodu lub wyjątku NotSupportedException.

Na szczęście metody końcowe w interfejsie nie pozwalają na żadną możliwość zmiany stanu. Byłby to jedyny "zrozumiały" przypadek, jaki mogłem wymyślić.

Powiązane problemy