Cette entrée traite de la définition de méthodes abstraites dans l'énumération Java et de l'écriture de leur comportement. (Celui écrit dans la 3e édition de Effective Java est presque le même. Notez ce que vous avez essayé.)
Java enum vous permet de définir des méthodes ainsi que des valeurs.
Motif qui définit uniquement la valeur
enum Operator {
PLUS, SUBTRACT, MULTIPLY, DIVIDE, NONE
}
D'autre part, vous pouvez définir une méthode pour chaque valeur et l'écrire comme indiqué dans la figure ci-dessous.
enum Operator {
PLUS {
@Override
BigDecimal apply(@NonNull BigDecimal lhs, @NonNull BigDecimal rhs) {
return lhs.add(rhs);
}
},
SUBTRACT{
@Override
BigDecimal apply(@NonNull BigDecimal lhs, @NonNull BigDecimal rhs) {
return lhs.subtract(rhs);
}
},
MULTIPLY {
@Override
BigDecimal apply(@NonNull BigDecimal lhs, @NonNull BigDecimal rhs) {
return lhs.multiply(rhs);
}
},
DIVIDE {
@Override
BigDecimal apply(@NonNull BigDecimal lhs, @NonNull BigDecimal rhs) {
return lhs.divide(rhs, BigDecimal.ROUND_UNNECESSARY);//;
}
},
NONE {
// allow null for rhs
@Override
BigDecimal apply(@NonNull BigDecimal lhs, BigDecimal rhs) {
return lhs;
}
};
abstract BigDecimal apply(BigDecimal lhs, BigDecimal rhs);
}
Dans "abstract BigDecimal apply (BigDecimal lhs, BigDecimal rhs);" dans enum, la méthode à définir pour toutes les valeurs est spécifiée, et la méthode est remplacée lorsque chaque valeur est déclarée.
(Supplément) Dans la source ci-dessus, "@NonNull" est l'une des Annotations fournies par lombok qui implémente la vérification Null. est.
Si vous définissez enum dans le formulaire ci-dessus, par exemple, la méthode suivante
public synchronized BigDecimal pushEvalButton() {
var v = new BigDecimal(sb.toString());
switch(currentOperator) {
case PLUS: {
v = stack.add(getCurrentValue());
break;
}
case SUBTRACT: {
v = stack.subtract(getCurrentValue());
break;
}
case MULTIPLY: {
v = stack.multiply(getCurrentValue());
break;
}
case DIVIDE: {
v = stack.divide(getCurrentValue(), BigDecimal.ROUND_UNNECESSARY);//
break;
}
case NONE: {
return v;
}
default: {
throw new RuntimeException("Not defined.");
}
}
currentOperator = Operator.NONE;
replaceBuffer(v.toPlainString());
clearStack();
return v;
}
Vous pouvez écrire clairement comme suit.
public synchronized BigDecimal pushEvalButton() {
var v = new BigDecimal(sb.toString());
if(Operator.NONE == currentOperator) {
return v;
}
v = currentOperator.apply(stack, getCurrentValue());
currentOperator = Operator.NONE;
replaceBuffer(v.toPlainString());
clearStack();
return v;
}
Étant donné que le contenu est passé à la méthode enum, il est naturel que le code soit réduit par rapport à la méthode d'origine, mais j'ai estimé que ce qui suit était méritoire.
Dans cette entrée, j'ai montré un exemple de définition de méthodes abstraites dans une énumération Java et d'écriture de leur comportement.
Voir [This commit] sur GitHub (https://github.com/hrkt/commandline-calculator/commit/47e7b05075c2bb632b9bdabdf044ab3b5cefdeee) pour un exemple des différences ci-dessus.
Recommended Posts