Wie bereits erwähnt here lambdas bieten eine ziemlich elegante Möglichkeit, Verhalten für einzelne Enum-Werte angeben.Gibt es einen Grund, Methoden in enums in Java zu überschreiben 8
Bevor Java 8 Ich würde normalerweise umgesetzt haben dies als:
enum Operator {
TIMES {
public int operate(int n1, int n2) {
return n1 * n2;
}
},
PLUS {
public int operate(int n1, int n2) {
return n1 + n2;
}
};
public int operate(int n1, int n2) {
throw new AssertionError();
}
}
Jetzt neige ich dazu verwenden:
enum Operator {
TIMES((n1, n2) -> n1 * n2),
PLUS((n1, n2) -> n1 + n2);
private final BinaryOperator<Integer> operation;
private Operator(BinaryOperator<Integer> operation) {
this.operation = operation;
}
public int operate(int n1, int n2) {
return operation.apply(n1, n2);
}
}
Das wesentlich elegantere scheint.
Ich kann mir jetzt keinen Grund vorstellen, Methoden für einen bestimmten Enum-Wert zu überschreiben. Also meine Frage ist, gibt es irgendwelche guten Gründe, Methodenüberschreibungen in einem enum
jetzt zu verwenden oder sollte eine funktionale Schnittstelle immer bevorzugt werden?
denke ich, dass 'public int operate' im ersten Code sein sollte ... –
Sie viele Methoden haben könnten, sich gegenseitig in einem Enum Aufruf. Und ihre Signatur stimmt möglicherweise nicht mit einer der Standardfunktionsschnittstellen überein. Übrigens sollte Ihre Methode operate() in Ihrem ersten Snippet als abstrakt deklariert werden, anstatt eine Implementierung bereitzustellen. –
Ein anderer Weg (in Ihrem speziellen Beispiel) wäre 'enum Operator implementiert BinaryOperator' und implementieren Sie dann 'apply' direkt. –