Una delle funzionalità più utili di Java 8 sono i nuovi default
metodi sulle interfacce. Ci sono essenzialmente due ragioni (potrebbero essercene altre) per cui sono state introdotte:
- Fornire implementazioni predefinite effettive. Esempio:
Iterator.remove()
- Consentire l'evoluzione dell'API JDK. Esempio:
Iterable.forEach()
Dal punto di vista di un progettista API, mi sarebbe piaciuto poter usare altri modificatori su metodi di interfaccia, ad es final
. Ciò sarebbe utile quando si aggiungono metodi di praticità, evitando sostituzioni "accidentali" nelle classi di implementazione:
interface Sender {
// Convenience method to send an empty message
default final void send() {
send(null);
}
// Implementations should only implement this method
void send(String message);
}
Quanto sopra è già una pratica comune se Sender
fosse una classe:
abstract class Sender {
// Convenience method to send an empty message
final void send() {
send(null);
}
// Implementations should only implement this method
abstract void send(String message);
}
Ora, default
e final
sono ovviamente in contraddizione con le parole chiave, ma la parola chiave predefinita stessa non sarebbe stata strettamente richiesta , quindi presumo che questa contraddizione sia intenzionale, per riflettere le sottili differenze tra "metodi di classe con body" (solo metodi) e "interfaccia" metodi con corpo " (metodi predefiniti), cioè differenze che non ho ancora capito.
Ad un certo punto, il supporto per modificatori come static
e final
sui metodi di interfaccia non è stato ancora completamente esplorato, citando Brian Goetz :
L'altra parte è fino a che punto andremo a supportare gli strumenti di costruzione di classi nelle interfacce, come metodi finali, metodi privati, metodi protetti, metodi statici, ecc. La risposta è: non lo sappiamo ancora
Da quel momento alla fine del 2011, ovviamente, è static
stato aggiunto il supporto per i metodi nelle interfacce. Chiaramente, questo ha aggiunto molto valore alle librerie JDK stesse, come ad esempio con Comparator.comparing()
.
Domanda:
Qual è il motivo final
(e anche static final
) mai raggiunto le interfacce Java 8?
final
impedisce che un metodo venga sovrascritto e, vedendo come DEVI scavalcare i metodi ereditati dalle interfacce, non vedo perché abbia senso renderlo definitivo. A meno che non significasse che il metodo è definitivo DOPO averlo ignorato una volta .. In quel caso, forse ci sono delle difficoltà? Se non capisco questo diritto, per favore lasciami kmow. Sembra interessante
final
sarebbe utile impedire alle classi di implementazione di sovrascrivere l'implementazione predefinita di un metodo di interfaccia.