2013-03-20 8 views
6

Mam Java Enum jak pokazano poniżej:Niestandardowe pola na Java wyliczenia nie dostaję odcinkach

public enum ExecutionMode { 
    TYPE_A, 
    TYPE_B, 
    TYPE_C; 

    private ExecutionMode(){} //no args constr- no really required 

    private boolean incremental; //has get/set 
    private String someStr;  //has get/set 
} 

widzę, że po deserializacji, zwyczaj pola na wyliczenia są tracone. Po przeczytaniu więcej na ten temat, odniosłem wrażenie, że enum zostaje przekształcone do postaci szeregowej w łańcuch, a więc jego niestandardowe pola są ignorowane.

Jeśli to prawda, czy używam Enum tutaj & powinienem użyć POJO istead? Czy istnieje sposób na serializację niestandardowych pól (które nie są częścią konstruktora)?

Dzięki!

+2

Idź z pojo. Zobacz link tutaj, aby uzyskać informacje na temat serializacji "Enum": http://docs.oracle.com/javase/1.5.0/docs/guide/serialization/relnotes15.html – nattyddubbs

+0

Jeszcze jeden link do serializacji enum http://docs.oracle .com/javase/1.5.0/docs/guide/serialization/spec/serial-arch.html # enum –

Odpowiedz

7

Jeżeli wartości są stałe, to jest lepsze i nie trzeba do serializacji nic

public enum ExecutionMode { 
    TYPE_A(x,t), 
    TYPE_B(y,z), 
    TYPE_C(b,s) 

    private boolean incremental; //has get/set 
    private String someStr;  //has get/set 

    ExecutionMode(boolean incremental,String someStr){ 
     ///... set things appropriately 
    } 
} 

Jeśli ustawienie tych wartości w czasie wykonywania, moja skłonność byłoby, że to nie powinno być enum w pierwszej kolejności - powinno istnieć oddzielne POJO, które może zawierać wartości, jak również odniesienie do wartości wyliczeniowej.

+1

Niech te pola również się "definiują", jeśli nie zostaną zmienione. – nattyddubbs

+0

Zastanawiam się, czy to podejście (z ustawianiem) oznaczałoby, że zserializowane wyliczenie nie zawierałoby najnowszych wartości 'incremental' lub' someStr', ale zamiast tego będzie serializowane z wartościami domyślnymi. – yshavit

+1

@yshavit - Nie będzie utrzymywać stanu. Jeśli używasz seterów poza wyliczeniem, nie powinno to być wyliczeniem. – dfb

5

Od Java language specification:

Ostatnia metoda clone w Enum zapewnia stałe enum może nigdy być klonowane i szczególne traktowanie przez mechanizm serializacji zapewnia, że ​​zduplikowane przypadki nie są tworzone w wyniku z deserializacji. Odblaskowe tworzenie instancji typów jest zabronione. Łącznie te cztery rzeczy zapewniają, że żadne wystąpienia typu wyliczeniowego nie istnieją poza tymi zdefiniowanymi przez stałe enum.

To, o co prosisz, spowoduje utworzenie więcej niż jednego wystąpienia, powiedzmy, TYPE_A. To by się zepsuło. Wyliczenia powinny być niezmienne.

+0

Nie muszą być bezpaństwowcami, po prostu nie powinny mieć zmiennego stanu. – yshavit

+1

@yshavit - Dzięki; Zmieniłem sformułowanie na "niezmienne", aby usunąć wszelkie niejasności. – McDowell

+0

Dzięki @McDowell & yshavit - myślę, że "nie muszą być bezpaństwowcami, po prostu nie powinny mieć zmiennego stanu". prawdopodobnie podsumowuje to! –

Powiązane problemy