Chciałbym zadeklarować kierunek wyliczenia, który ma metodę zwracającą przeciwny kierunek (poniższy kod nie jest poprawny składniowo, tj. Nie można utworzyć instancji wyliczeń, ale ilustruje to mój punkt widzenia). Czy to możliwe w Javie?
Oto kod:
public enum Direction {
NORTH(1),
SOUTH(-1),
EAST(-2),
WEST(2);
Direction(int code){
this.code=code;
}
protected int code;
public int getCode() {
return this.code;
}
static Direction getOppositeDirection(Direction d){
return new Direction(d.getCode() * -1);
}
}
java
enums
enumeration
Skyler
źródło
źródło
d.getCode() * -1
==-d.getCode()
Odpowiedzi:
Dla tych, zwabionych tutaj tytułem: tak, możesz zdefiniować własne metody w swoim enum. Jeśli zastanawiasz się, jak wywołać taką niestatyczną metodę, robisz to tak samo, jak każdą inną niestatyczną metodę - wywołujesz ją na instancji typu, która definiuje lub dziedziczy tę metodę. W przypadku wyliczeń takie przypadki są po prostu
ENUM_CONSTANT
s.Więc wszystko, czego potrzebujesz, to
EnumType.ENUM_CONSTANT.methodName(arguments)
.Wróćmy teraz do problemu z pytania. Jednym z rozwiązań mogłoby być
Teraz
Direction.NORTH.getOppositeDirection()
wróciDirection.SOUTH
.Oto trochę bardziej "hacky" sposób zilustrowania komentarza @jedwards, ale nie wydaje się on tak elastyczny jak pierwsze podejście, ponieważ dodanie kolejnych pól lub zmiana ich kolejności zepsuje nasz kod.
źródło
.values()[ordinal()]
włamać się, ale to podejście jest znacznie bardziej niezawodneDirection
klasy enum sąNORTH
,EAST
,SOUTH
,WEST
więc można po prostu użyćNORTH.getOppositeDirection()
i powróciSOUTH
. „ jak nazywa się ta technika? ” jeśli o to pytasz,static{...}
to jest to statyczny blok inicjalizacyjny , kod wywoływany przy pierwszym ładowaniu klasy (jest to część tego samego procesu, który inicjalizuje pola statyczne).W przypadku małego wyliczenia, takiego jak ten, najbardziej czytelnym rozwiązaniem jest:
źródło
To działa:
źródło
Utwórz metodę abstrakcyjną i zastąp ją każdą z wartości wyliczenia. Ponieważ podczas tworzenia wiesz, że jest odwrotnie, nie ma potrzeby dynamicznego generowania ani tworzenia.
Nie czyta się jednak ładnie; może
switch
byłoby łatwiejsze w zarządzaniu?źródło
Tak, robimy to cały czas. Zwracasz instancję statyczną zamiast nowego obiektu
źródło
Wyliczenia mają statyczną metodę wartości, która zwraca tablicę zawierającą wszystkie wartości wyliczenia w kolejności, w jakiej są zadeklarowane. źródło
ponieważ NORTH dostaje 1, EAST dostaje 2, SOUTH dostaje 3, WEST dostaje 4; możesz utworzyć proste równanie, aby otrzymać odwrotne:
(wartość + 2)% 4
źródło