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
public enum Direction {
NORTH, SOUTH, EAST, WEST;
private Direction opposite;
static {
NORTH.opposite = SOUTH;
SOUTH.opposite = NORTH;
EAST.opposite = WEST;
WEST.opposite = EAST;
}
public Direction getOppositeDirection() {
return opposite;
}
}
Jetzt Direction.NORTH.getOppositeDirection()
wird zurückkehren Direction.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.
public enum Direction {
NORTH, EAST, SOUTH, WEST;
// cached values to avoid recreating such array each time method is called
private static final Direction[] VALUES = values();
public Direction getOppositeDirection() {
return VALUES[(ordinal() + 2) % 4];
}
}