Sto dando un'occhiata a Java 8 notizie rispetto a 7 e oltre a cose molto interessanti come lambda o la nuova struttura temporale, ho scoperto che una nuova funzionalità (?) È stata introdotta: metodi predefiniti.Perché abbiamo bisogno di metodi predefiniti in Java?
ho trovato il seguente esempio in this article:
public interface Math {
int add(int a, int b);
default int multiply(int a, int b) {
return a * b;
}
}
sembra molto strano per me. Sopra il codice appare come una classe abstract
con un metodo implementato. Quindi, perché introdurre metodi predefiniti in un'interfaccia? Qual è il reale vantaggio di questo approccio?
Nello stesso articolo che ho letto questa spiegazione:
Perché uno dovrebbe voler aggiungere metodi nelle interfacce? Lo faremo perché le interfacce sono troppo strettamente associate alle loro classi di implementazione. non è possibile aggiungere un metodo nell'interfaccia senza rompere la classe implementor. Una volta aggiunto un metodo nell'interfaccia, tutte le sue classi implementate devono dichiarare il corpo del metodo di questo nuovo metodo.
Beh, questo non mi convince affatto. IMHO Credo che quando una classe implementa un'interfaccia in modo obbiettivo deve dichiarare il metodo body per ogni metodo in esso contenuto. Questo è sicuramente un vincolo, ma è anche una conferma della sua "natura" (se capisci cosa intendo ...)
Se hai una logica comune a tutte le classi ereditanti, la inserirai in una classe di implementazione abstract
.
Quindi, qual è il vero vantaggio di un metodo predefinito? (Sembra più una soluzione di una nuova funzionalità ...)
UPDATE capisco che questo approccio è per la compatibilità all'indietro, ma ancora non mi convince tanto. Un'interfaccia rappresenta un comportamento che una classe DEVE avere. Quindi una classe che implementa una determinata interfaccia ha sicuramente questo comportamento. Ma se qualcuno può cambiare arbitrariamente l'interfaccia, questo vincolo è rotto. Il comportamento può cambiare in qualsiasi momento ... Ho sbagliato?
Correlato: http://stackoverflow.com/questions/19998454/interface-with-default-methods-vs-abstract-class-in-java-8 e http://stackoverflow.com/questions/20139404/java -8-default-methods-vs-non-abstract-methods-in-abstract-classes – assylias
Puoi 'estendere' solo una classe, ma' implementa 'tutte le interfacce che vuoi. –