Come hai detto, le interfacce sono utilizzate per specificare i contratti che devono seguire le classi che li implementano. Gli scenari in cui vengono utilizzati è solitamente uno scenario in cui si chiama una classe che implementa un'interfaccia particolare. Il fatto che l'implementazione di una particolare interfaccia ti fornisca la consapevolezza che quella determinata classe, in effetti, implementa un determinato insieme di metodi. Di solito non ti importa cosa succede in questi metodi, ciò che conta per te è che la classe ha questi metodi.
Ad esempio, è possibile prendere in considerazione lo Observer Design Pattern. Fondamentalmente, hai un oggetto che ha uno stato che condivide con altri oggetti e passa a loro le notifiche quando alcuni dei suoi dati cambiano.
Quindi, se per esempio tutti gli osservatori implementano la seguente interfaccia:
public interface Observer
{
notify();
}
il soggetto può, senza alcuna conoscenza di che cosa così mai a questo proposito è osservatori, fare qualcosa di simile:
public class MySubject...
{
List<Observer> observers;
.....
public void notifyAll()
{
for (Observer observer : observers)
{
observer.notify();
}
}
}
Come si può vedere, la classe MySubject
non ha alcuna conoscenza di come l'Observer implementa il metodo notify
, ciò che veramente interessa è che lo implementa.Ciò consente di creare osservatori diversi che hanno diversi modi di implementare la propria classe notify
senza richiedere alcuna modifica nella classe MySubject
.
Le interfacce consentono anche una certa sicurezza del tipo. Le interfacce sono generalmente utili anche quando si dispone di una serie di classi che implementano una serie di comportamenti simili che di solito si desidera archiviare in una struttura di dati sicura per tipo. Questo di solito è un buon lavoro sul fatto che Java non consente l'ereditarietà multipla. Quindi, nell'esempio sopra riportato, posso avere una quantità indefinita di classi diverse. Ma se tutti implementano l'interfaccia Observer
, possono essere tutti aggiunti alla stessa lista.
Nelle notifyAll
metodi, quindi posso solo scorrere degli elementi della lista invece di controllare se l'elemento è di un certo tipo e poi lanciarlo, che può introdurre un overhead aggiuntivo nell'esecuzione del programma.
non lo so se è esattamente una risposta, quindi commenterò. 'interface's è fondamentale in java perché non hai ereditarietà multipla. Se vuoi che la tua classe sia 'Iterable', ma vuoi anche implementare una determinata logica, non puoi ereditare da 2 classi, quindi dovrai usare l'interfaccia. Quindi, se hai bisogno di più di 1 logica da implementare da una classe [che non è rara], non puoi usare solo le classi 'abstract', dovrai usare una' interfaccia'. – amit
Questo è un altro uso –
Forse duplicato di http://stackoverflow.com/q/8531292/1055241 controlla la risposta accettata per comprendere il concetto di interfacce. – gprathour