Come indicato in precedenza, here lambdas fornisce un modo abbastanza elegante di specificare il comportamento per i singoli valori enum.C'è qualche motivo per sovrascrivere i metodi in enumerazione in Java 8
Prima di Java 8 che normalmente hanno attuato questo come:
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();
}
}
Ora tendo a usare:
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);
}
}
Questo sembra molto più elegante.
Non riesco a pensare a un motivo per sovrascrivere i metodi per un valore enum specifico ora. Quindi la mia domanda è: ci sono dei buoni motivi per usare le sostituzioni dei metodi in un enum
o dovrebbe sempre essere preferibile un'interfaccia funzionale?
penso che dovrebbe essere 'int operate' pubblico nel primo codice ... –
Si potrebbe avere molti metodi, chiamando l'un l'altro, in un enum. E la loro firma potrebbe non corrispondere a nessuna delle interfacce funzionali standard. A proposito, nel tuo primo frammento di codice, il tuo metodo operation() dovrebbe essere dichiarato astratto piuttosto che fornire un'implementazione. –
Un altro modo (nell'esempio specifico) sarebbe 'enum Operator implementa BinaryOperator' e quindi implementa 'apply' direttamente. –