Utworzyłem Enum, aby zdefiniować określone akcje. Programowanie z zewnętrznego interfejsu API Aby wyrazić tę akcję, muszę użyć Integer
. Właśnie dlatego dodałem pole instancji całkowitej do mojego Enum. Powinno to być zgodne z Efektywną Javą Joshua Blocha, zamiast polegać na ordinal()
lub kolejności stałych Enum przy użyciu values()[index]
.Utwórz metodę fabryki wyliczeniowej z unikalnej wartości instancji
public enum Action {
START(0),
QUIT(1);
public final int code;
Protocol(int code) {
this.code = code;
}
}
uzyskać wartość całkowitą what
z API i teraz chcę utworzyć wartość Enum z niego, w jaki sposób można zaimplementować to w najbardziej rodzajowe mody?
Oczywiście dodanie takiej metody fabrycznej nie będzie działać. Nie można utworzyć instancji Enum.
Action valueOf(int what) {
return new Action(what);
}
Oczywiście zawsze mogę utworzyć instrukcję switch-case i dodać wszystkie możliwe kody i zwrócić odpowiednią stałą. Ale chcę uniknąć definiowania ich w dwóch miejscach w tym samym czasie.
Można zainicjować mapę o odpowiednim rozmiarze: 'new HashMap <> (Action.values (). Length, 1);' (nie będzie miało znaczenia, jeśli nie ma zbyt wielu wartości, ale to nie kosztuje cokolwiek to robi). – assylias
@assylias Zabawne, zajrzałem do kodu źródłowego i konstruktor faktycznie ignoruje współczynnik obciążenia: * Zauważ, że ta implementacja ignoruje loadFactor; zawsze wykorzystuje współczynnik obciążenia 3/4. Upraszcza to kod i ogólnie poprawia wydajność. * –
Nie wiedziałem tego - interesujące. – assylias