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);
     }
}
85
demandé sur Skyler 2013-09-19 02:55:16

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];
    }
}
164
répondu Pshemo 2017-09-07 20:20:42

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();

}
130
répondu Amir Afghani 2013-09-18 23:06:24

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");
    }
}
20
répondu Pikrass 2017-08-02 10:35:17

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();
}
13
répondu Makoto 2013-09-18 23:04:11

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;
 }
5
répondu BevynQ 2014-03-09 21:33:04
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

0
répondu Pregunton 2017-06-27 21:33:12