Ich möchte eine Aufzählungsrichtung deklarieren, die eine Methode hat, die die entgegengesetzte Richtung zurückgibt (das Folgende ist syntaktisch nicht korrekt, dh Aufzählungen können nicht instanziiert werden, aber es veranschaulicht meinen Punkt). Ist das in Java möglich?
Hier ist der Code:
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
quelle
quelle
d.getCode() * -1
==-d.getCode()
Antworten:
Für diejenigen, die hier nach Titel gelockt werden: Ja, Sie können Ihre eigenen Methoden in Ihrer Aufzählung definieren. Wenn Sie sich fragen, wie Sie eine solche nicht statische Methode aufrufen sollen, gehen Sie genauso vor wie bei jeder anderen nicht statischen Methode - Sie rufen sie bei einer Instanz des Typs auf, der diese Methode definiert oder erbt. Bei Aufzählungen sind solche Instanzen einfach
ENUM_CONSTANT
s.Alles was Sie brauchen ist
EnumType.ENUM_CONSTANT.methodName(arguments)
.Kehren wir nun von Frage zu Problem zurück. Eine der Lösungen könnte sein
Jetzt
Direction.NORTH.getOppositeDirection()
wird zurückkehrenDirection.SOUTH
.Hier ist etwas "hackiger", um @ jedwards Kommentar zu veranschaulichen , aber es fühlt sich nicht so flexibel an wie der erste Ansatz, da das Hinzufügen weiterer Felder oder das Ändern ihrer Reihenfolge unseren Code beschädigen wird.
quelle
.values()[ordinal()]
HackDirection
Enum - Klasse sindNORTH
,EAST
,SOUTH
,WEST
so dass Sie nur verwenden können ,NORTH.getOppositeDirection()
und es wird zurückkehrenSOUTH
. " Wie heißt diese Technik? " Wenn Sie nachfragen, handeltstatic{...}
es sich um einen statischen Initialisierungsblock . Es handelt sich um Code, der beim ersten Laden der Klasse aufgerufen wird (er ist Teil desselben Prozesses, der statische Felder initialisiert).Für eine kleine Aufzählung wie diese finde ich die am besten lesbare Lösung:
quelle
Das funktioniert:
quelle
Erstellen Sie eine abstrakte Methode und lassen Sie sie von jedem Ihrer Aufzählungswerte überschreiben. Da Sie beim Erstellen das Gegenteil kennen, müssen Sie es nicht dynamisch generieren oder erstellen.
Es liest sich aber nicht gut; vielleicht
switch
wäre ein überschaubarer?quelle
Ja, wir machen es die ganze Zeit. Sie geben eine statische Instanz anstelle eines neuen Objekts zurück
quelle
Aufzählungen haben eine statische Wertemethode, die ein Array zurückgibt, das alle Werte der Aufzählung in der Reihenfolge enthält, in der sie deklariert sind. Quelle
da NORTH 1 bekommt, bekommt EAST 2, SOUTH 3, WEST 4; Sie können eine einfache Gleichung erstellen, um die entgegengesetzte zu erhalten:
(Wert + 2)% 4
quelle