Domanda da un libro:Java 8 - di default metodi - rischi di codice legacy
In passato (pre-Java 8), è stato detto che si tratta di cattiva forma per aggiungere i metodi per un'interfaccia perché spezzerebbe il codice esistente. Ora ti viene detto che va bene aggiungere nuovi metodi, purché tu fornisca anche un'implementazione predefinita.
- Quanto è sicuro? Descrivere uno scenario in cui il nuovo metodo
stream
dell'interfacciaCollection
causa la compilazione del codice legacy.- E la compatibilità binaria? Sarà codice legacy da un file JAR correre ancora?"
Le mie risposte sono le seguenti, ma io non sono del tutto sicuro su di loro.
- è sicuro solo se il codice legacy non fornisce un metodo con lo stesso nome
stream
e con la stessa firma (ad esempio in una classe precedente che implementaCollection
) Altrimenti, questo vecchio codice legacy non riuscirà a compilare. - Penso che la compatibilità binaria sia preservata, il codice precedente dal vecchio file JAR verrà comunque eseguito Ma non ho argomenti chiari su questo S.
Qualcuno potrebbe confermare o rifiutare queste risposte o semplicemente aggiungere ulteriori argomenti, riferimenti o chiarezza a queste risposte?
[Correlato] (http://stackoverflow.com/a/22618640/335858). – dasblinkenlight
Fare ciò preservando la compatibilità binaria è stata la motivazione principale dell'aggiunta di metodi predefiniti alla lingua.L'aggiunta di un valore predefinito a un metodo esistente è binario e compatibile all'origine; l'aggiunta di un nuovo metodo con un valore predefinito è binario e compatibile con la sorgente (interazioni modulo con metodi di contrasto in sottoclassi - ha caratteristiche di compatibilità identiche all'aggiunta di un nuovo metodo a una classe non finale.) –
Mentre la compatibilità binaria viene mantenuta, è possibile che ci sia ancora i problemi sorgono quando interagisce con il comportamento della libreria JRE, come in [questo scenario] (http://stackoverflow.com/q/26816650/2711488). Si può anche considerare che un metodo potrebbe avere una firma * compatibile *, quindi, inizia a sovrascrivere un nuovo metodo 'default' senza intenderlo ... – Holger