Me gustaría declarar una dirección de enumeración, que tiene un método que devuelve la dirección opuesta (lo siguiente no es sintácticamente correcto, es decir, no se pueden crear instancias de enumeraciones, pero ilustra mi punto). ¿Es esto posible en Java?
Aquí está el 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
fuente
fuente
d.getCode() * -1
==-d.getCode()
Respuestas:
Para aquellos atraídos aquí por el título: sí, puede definir sus propios métodos en su enumeración. Si se pregunta cómo invocar dicho método no estático, hágalo de la misma manera que con cualquier otro método no estático: lo invoca en una instancia del tipo que define o hereda ese método. En el caso de enumeraciones, estos casos son simplemente
ENUM_CONSTANT
s.Así que todo lo que necesitas es
EnumType.ENUM_CONSTANT.methodName(arguments)
.Ahora volvamos al problema de la pregunta. Una de las soluciones podría ser
Ahora
Direction.NORTH.getOppositeDirection()
volveráDirection.SOUTH
.Aquí hay una forma un poco más "hacky" de ilustrar el comentario de @jedwards, pero no se siente tan flexible como el primer enfoque, ya que agregar más campos o cambiar su orden romperá nuestro código.
fuente
.values()[ordinal()]
truco, pero este enfoque es mucho más robustoDirection
la clase de enumeración sonNORTH
,EAST
,SOUTH
,WEST
por lo que sólo puede utilizarNORTH.getOppositeDirection()
y ha de devolverSOUTH
. " ¿Cómo se llama esta técnica? " Si está preguntando acerca destatic{...}
entonces es un bloque de inicialización estático , se invoca el código cuando la clase se carga por primera vez (es parte del mismo proceso que inicializa los campos estáticos).Para una pequeña enumeración como esta, encuentro que la solución más legible es:
fuente
Esto funciona:
fuente
Cree un método abstracto y haga que cada uno de sus valores de enumeración lo anule. Como sabe lo contrario mientras lo crea, no es necesario generarlo o crearlo dinámicamente.
Sin embargo, no se lee bien; tal vez
switch
sería más manejable?fuente
Sí, lo hacemos todo el tiempo. Devuelve una instancia estática en lugar de un nuevo objeto
fuente
Las enumeraciones tienen un método de valores estáticos que devuelve una matriz que contiene todos los valores de la enumeración en el orden en que se declaran. fuente
dado que NORTE obtiene 1, ESTE obtiene 2, SUR obtiene 3, OESTE obtiene 4; puedes crear una ecuación simple para obtener la opuesta:
(valor + 2)% 4
fuente