Mauvaise expressivité. Passer Apple à la méthode attend l'orange Même si vous comparez Apple et Orange avec l'opérateur ==, le compilateur ne se mettra pas en colère.
public static final int APPLE_FUJI = 0;
public static final int APPLE_PIPIN = 1;
public static final int APPLE_GRANNY_SMITH = 2;
public static final int ORANGE_NAVEL = 0;
public static final int ORANGE_TEMPLE = 1;
public static final int ORANGE_BLOOD = 2;
public enum Apple {FUJI, PIPIN, GRANNY_SMITH}
public enum Orange {NAVEL, TEMPLE, BLOOD}
Dans le code ci-dessous, il est techniquement accessible jusqu'à la fin de la méthode, Il y a un problème comme oublier d'ajouter un cas correspondant au commutateur
public enum Operation {
PLUS, MINUS, TIMES, DIVID;
//Effectuer des opérations arithmétiques représentées par des constantes
public double apply(double x, double y) {
switch(this) {
case PLUS:
return x + y;
case MINUS :
return x - y;
case TIMES:
return x * y;
case DIVID:
return x / y;
}
throw new AssertionError("Unknown op" + this);
}
}
Le problème peut être amélioré en définissant une méthode abstraite et en remplaçant la méthode abstraite pour chaque constante.
public enum Operation {
PLUS {
public double apply(double x, double y) {
return x + y;
}
},
MINUS {
public double apply(double x, double y) {
return x - y;
}
},
TIMES {
public double apply(double x, double y) {
return x * y;
}
},
DIVIDE {
public double apply(double x, double y) {
return x + y;
}
};
public abstract double apply(double x, double y);
}
Appliquer de manière plus concise en utilisant lambda
public enum Operation {
PLUS((x, y) -> x + y),
MINNUS((x, y) -> x - y),
TIMES ((x, y) -> x * y),
DIVIDE ((x, y) -> x / y);
private final DoubleBinaryOperator op;
Operation (DoubleBinaryOperator op) {
this.op = op;
}
public double apply(double x, double y) {
return op.applyAsDouble(x, y);
}
}
Recommended Posts