Eu gostaria de declarar um enum Direction, que tem um método que retorna a direção oposta (o seguinte não é sintaticamente correto, ou seja, enums não podem ser instanciados, mas ilustra meu ponto). Isso é possível em Java?
Aqui está o código:
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
fonte
fonte
d.getCode() * -1
==-d.getCode()
Respostas:
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
Agora
Direction.NORTH.getOppositeDirection()
vai voltarDirection.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.
fonte
.values()[ordinal()]
hack, mas essa abordagem é muito mais robustaDirection
classe enum sãoNORTH
,EAST
,SOUTH
,WEST
para que você pode apenas usarNORTH.getOppositeDirection()
e ele irá retornarSOUTH
. “ como é chamada essa técnica? ” se você está perguntando sobrestatic{...}
então é um bloco de inicialização estático , é um código chamado quando a classe é carregada pela primeira vez (é parte do mesmo processo que inicializa campos estáticos).Para um pequeno enum como este, acho que a solução mais legível é:
fonte
Isso funciona:
fonte
Crie um método abstrato e faça com que cada um dos valores de enumeração o substitua. Como você sabe o oposto ao criá-lo, não há necessidade de gerá-lo ou criá-lo dinamicamente.
Embora não tenha uma boa leitura; talvez um
switch
fosse mais gerenciável?fonte
Sim, fazemos isso o tempo todo. Você retorna uma instância estática em vez de um novo objeto
fonte
Enums têm um método de valores estáticos que retorna uma matriz contendo todos os valores do enum na ordem em que são declarados. fonte
uma vez que NORTH obtém 1, EAST obtém 2, SOUTH obtém 3, WEST obtém 4; você pode criar uma equação simples para obter o oposto:
(valor + 2)% 4
fonte