Le interfacce sono eccezionali dal punto di vista della flessibilità. Ma nel caso in cui un'interfaccia è utilizzata da un gran numero di client. L'aggiunta di nuovi metodi all'interfaccia mantenendo intatti i vecchi mehtod interromperà il codice di tutti i client poiché nuovi metodi non saranno presenti nei client. Come mostrato di seguito:Le interfacce possono evolversi con il tempo?
public interface CustomInterface {
public void method1();
}
public class CustomImplementation implements CustomInterface {
@Override
public void method1() {
System.out.println("This is method1");
}
}
Se ad un certo punto più avanti nel tempo, aggiungiamo un altro metodo a questa interfaccia codice di tutti i clienti si romperà.
public interface CustomInterface {
public void method1();
public void method2();
}
Per evitare questo, dobbiamo implementare in modo esplicito nuovi metodi nel codice di tutti i client.
Quindi penso di interfacce e questo scenario come segue:
- Interfacce volta scritti sono come la scultura in pietra. Si suppone raramente e si prevede che cambi. E se lo fanno, hanno un costo enorme (riscrivendo l'intero codice) che i programmatori dovrebbero essere pronti.
- In seguito al punto precedente, è possibile scrivere interfacce in grado di resistere alla prova del tempo?
- Come viene gestito tale scenario nelle interfacce in cui prevedi funzionalità aggiuntive in futuro? Ciò sta anticipando il cambiamento nel contratto con cui tutti i clienti sono vincolati.
MODIFICA: il metodo Default
è davvero una bella aggiunta alle interfacce Java che molte persone hanno menzionato nelle loro risposte. Ma la mia domanda era più nel contesto della progettazione del codice. E come forzare l'implementazione del metodo sul client è un carattere intrinseco di un'interfaccia. Ma questo contratto tra un'interfaccia e un client sembra fragile mentre la funzionalità si evolverà alla fine.
Suggerimento di lettura: le linee guida di progettazione del framework (è .net ma è anche una buona lettura per il programmatore java) ha una sezione sul chosing tra classe o interfaccia. Come affermato da altre risposte, anche loro parlano dell'utilizzo delle classi poiché sono molto più flessibili delle interfacce e consentono di evolvere senza infrangere il codice client. –