Para aqueles atraídos aqui pelo título: sim, você pode definir seus próprios métodos em seu enum. Se você está se perguntando como invocar esse método não estático, faça-o da mesma forma que com qualquer outro método não estático - invoque-o na instância do tipo que define ou herda esse método. No caso de enums, essas instâncias são simplesmente ENUM_CONSTANT
s.
Então, tudo que você precisa é EnumType.ENUM_CONSTANT.methodName(arguments)
.
Agora vamos voltar ao problema da pergunta. Uma das soluções pode ser
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;
}
}
Agora Direction.NORTH.getOppositeDirection()
vai voltar Direction.SOUTH
.
Aqui está uma forma um pouco mais "hacky" de ilustrar o comentário @jedwards, mas não parece tão flexível quanto a primeira abordagem, pois adicionar mais campos ou alterar sua ordem quebrará nosso código.
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];
}
}