Méthodes Java Enum
je voudrais déclarer une Direction enum, qui a une méthode qui retourne la direction opposée (ce qui suit n'est pas syntaxiquement correct, I. e, enums cannot be instanciated, but it illustrates my point). Est-ce possible en Java?
voici le 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);
}
}
6 réponses
Pour ceux qui sont attirés ici par le titre: oui, vous pouvez définir vos propres méthodes d'enum. Si vous vous demandez comment invoquer le non méthode statique, vous faire la même façon qu'avec tout autre non méthode statique - vous invoquer sur l'instance de type qui définit ou hérite de cette méthode. Dans le cas des énums, ces cas sont simplement ENUM_CONSTANT
S.
donc tout ce dont vous avez besoin est EnumType.ENUM_CONSTANT.methodName(arguments)
.
revenons maintenant au problème à partir de la question. Une des solutions pourrait être
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;
}
}
Maintenant Direction.NORTH.getOppositeDirection()
sera de retour Direction.SOUTH
.
voici un peu plus de "hacky" façon d'illustrer @jedwards commentaire mais il est ne se sent pas aussi flexible que la première approche
public enum Direction {
NORTH, EAST, SOUTH, WEST;
private static final Direction[] VALUES = values();//cached values
//to avoid recreating array
public Direction getOppositeDirection() {
return VALUES[(ordinal() + 2) % 4];
}
}
pour un petit enum comme celui-ci, je trouve que la solution la plus lisible est:
public enum Direction {
NORTH {
@Override
public Direction getOppositeDirection() {
return SOUTH;
}
},
SOUTH {
@Override
public Direction getOppositeDirection() {
return NORTH;
}
},
EAST {
@Override
public Direction getOppositeDirection() {
return WEST;
}
},
WEST {
@Override
public Direction getOppositeDirection() {
return EAST;
}
};
public abstract Direction getOppositeDirection();
}
Cela fonctionne:
public enum Direction {
NORTH, SOUTH, EAST, WEST;
public Direction oppose() {
switch(this) {
case NORTH: return SOUTH;
case SOUTH: return NORTH;
case EAST: return WEST;
case WEST: return EAST;
}
throw new RuntimeException("Case not implemented");
}
}
créez une méthode abstraite, et faites que chacune de vos valeurs d'énumération la supplante. Puisque vous savez le contraire pendant que vous le Créez, il n'y a aucun besoin de le générer ou de le créer dynamiquement.
il ne se lit pas bien cependant; peut-être un switch
serait-il plus gérable?
public enum Direction {
NORTH(1) {
@Override
public Direction getOppositeDirection() {
return Direction.SOUTH;
}
},
SOUTH(-1) {
@Override
public Direction getOppositeDirection() {
return Direction.NORTH;
}
},
EAST(-2) {
@Override
public Direction getOppositeDirection() {
return Direction.WEST;
}
},
WEST(2) {
@Override
public Direction getOppositeDirection() {
return Direction.EAST;
}
};
Direction(int code){
this.code=code;
}
protected int code;
public int getCode() {
return this.code;
}
public abstract Direction getOppositeDirection();
}
Oui, nous le faisons tout le temps. Vous retournez une instance statique plutôt qu'un nouvel objet
static Direction getOppositeDirection(Direction d){
Direction result = null;
if (d != null){
int newCode = -d.getCode();
for (Direction direction : Direction.values()){
if (d.getCode() == newCode){
result = direction;
}
}
}
return result;
}
public enum Direction {
NORTH, EAST, SOUTH, WEST;
public Direction getOppositeDirection(){
return Direction.values()[(this.ordinal() + 2) % 4];
}
}
les Énumérations ont des valeurs statiques méthode qui retourne un tableau contenant toutes les valeurs de l'enum dans l'ordre où elles sont déclarées. source
depuis le nord obtient 1, L'est obtient 2, le sud obtient 3, L'ouest obtient 4; vous pouvez créer une équation simple pour obtenir le contraire:
(valeur + 2) % 4