Je voudrais déclarer une direction enum, qui a une méthode qui renvoie la direction opposée (ce qui suit n'est pas syntaxiquement correct, c'est-à-dire que les énumérations ne peuvent pas être instanciées, mais cela illustre mon 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);
}
}
java
enums
enumeration
Skyler
la source
la source
d.getCode() * -1
==-d.getCode()
Réponses:
Pour ceux qui sont attirés ici par leur titre: oui, vous pouvez définir vos propres méthodes dans votre énumération. Si vous vous demandez comment invoquer une telle méthode non statique, vous le faites de la même manière qu'avec toute autre méthode non statique - vous l'appelez sur une instance de type qui définit ou hérite de cette méthode. Dans le cas d'énumérations, ces instances sont simplement l'
ENUM_CONSTANT
art.Donc, tout ce dont vous avez besoin est
EnumType.ENUM_CONSTANT.methodName(arguments)
.Revenons maintenant au problème à partir de la question. L'une des solutions pourrait être
Je
Direction.NORTH.getOppositeDirection()
reviendrai maintenantDirection.SOUTH
.Voici une manière un peu plus «hacky» d'illustrer le commentaire @jedwards mais cela ne semble pas aussi flexible que la première approche car l'ajout de plus de champs ou la modification de leur ordre cassera notre code.
la source
.values()[ordinal()]
hack mais cette approche est beaucoup plus robusteDirection
classe enum sontNORTH
,EAST
,SOUTH
, deWEST
sorte que vous pouvez simplement utiliserNORTH.getOppositeDirection()
et il retourneraSOUTH
. " comment s'appelle cette technique? " si vous posez la question,static{...}
alors c'est un bloc d'initialisation statique , c'est du code appelé lorsque la classe est chargée pour la première fois (cela fait partie du même processus qui initialise les champs statiques).Pour une petite énumération comme celle-ci, je trouve que la solution la plus lisible est:
la source
Cela marche:
la source
Créez une méthode abstraite et faites en sorte que chacune de vos valeurs d'énumération la remplace. Puisque vous savez le contraire pendant que vous le créez, il n'est pas nécessaire de le générer ou de le créer dynamiquement.
Il ne lit pas bien cependant; peut-être un
switch
serait plus gérable?la source
Oui, nous le faisons tout le temps. Vous renvoyez une instance statique plutôt qu'un nouvel objet
la source
Les énumérations ont une méthode de valeurs statiques qui renvoie un tableau contenant toutes les valeurs de l'énumération dans l'ordre dans lequel elles sont déclarées. la source
puisque NORTH obtient 1, EAST obtient 2, SUD obtient 3, WEST obtient 4; vous pouvez créer une équation simple pour obtenir l'inverse:
(valeur + 2)% 4
la source