2012-01-25 10 views
8

Le interfacce sono costituite da metodi astratti e variabili finali. Bene, è usato come un contratto generalizzato messo in modo che le classi che lo implementino dovrebbero seguire le regole implementando i metodi in esso.Scopo dell'utilità dell'interfaccia in java

È questo il utilizzare solo/scope dell'interfaccia in Java? Hanno introdotto il concetto di interfaccia solo per questo, o mi manca qualcosa? Per favore aiutami a capire l'uso delle interfacce, con esempi. (Non su come utilizzare o creare interfacce, ma per mostrare come stanno aiutando i programmatori).

Grazie.

+1

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

+0

Questo è un altro uso –

+0

Forse duplicato di http://stackoverflow.com/q/8531292/1055241 controlla la risposta accettata per comprendere il concetto di interfacce. – gprathour

risposta

3

Lo scopo principale di interfacce è quella di agire come una guida per programmatori che devono implementare certo comportamento in una classe di attuazione.

Per esempio, se si dovesse andare ad implementare una classe Queue che implementa l'interfaccia List, l'interfaccia List richiederebbe che si implementa il metodo add e un metodo di rimozione, per esempio.

interface List { 

    public void add(Object o); 

    public void remove(Object o); 

} 

Se la coda implementa l'interfaccia Elenco, è necessario implementare la propria versione dei metodi di aggiunta e rimozione. Il vantaggio principale di utilizzare un'interfaccia è che è possibile quindi scambiare un tipo con un altro. Per esempio:

// this function returns an ArrayList 
List genericList = (ArrayList) getAnArrayList(); 

O

// this function returns the Queue you implemented 
List myQueue = (MyQueue) getAQueue(); 

Implementando la classe come interfaccia, è possibile dichiarare le variabili utilizzando un tipo più generico che se si sceglie di usare un tipo concreto. Trovo che ciò sia veramente utile con un oggetto di trasferimento di dati o bean in cui una classe di servizio potrebbe utilizzare un ArrayList, ma un altro potrebbe trarre vantaggio dall'utilizzo di un HashSet.Nel mio bean posso usare la dichiarazione dell'interfaccia e lasciare che ogni classe di servizio determini il tipo concreto che vuole utilizzare lanciando la variabile al tipo concreto.

Le interfacce sono fondamentalmente un modo per aiutare a standardizzare le cose e facilitare lo scambio di una classe di implementazione con un'altra.

Inoltre, mi aiutano a ricordare di implementare determinati metodi quando sto programmando qualcosa, dato che posso delinearli prima nell'interfaccia e quindi il compilatore mi ricorda di implementarli.

+0

Ok capito. Altri usi importanti di esso? –

+0

Come gli utenti di altre risposte menzionate, le interfacce possono in qualche modo aiutare con la mancanza di ereditarietà multipla. Nella maggior parte dei casi, vengono generalmente utilizzati da sviluppatori di librerie o progetti in cui potrebbe essere necessario scambiare un sottotipo con un altro. Memorizzazione nella cache o archiviazione dei dati è un possibile esempio. La registrazione è un'altra. È possibile utilizzare un'interfaccia Datastore per astrarre il tuo JDO, Hibernate, Postgres, MySQL, ecc. In modo che tu possa scambiarne uno con un altro senza dover cambiare ogni singola dichiarazione di variabile nel tuo codice. – jmort253

+0

Grazie. Ho la mia risposta –

3

È un esempio classico ma comunque. Ad esempio, si desidera scrivere un gioco in cui dovrebbero essere cerchi, quadrati, triangoli e altre forme. Non sai quale forma verrà la prossima volta quindi dovresti scrivere un'interfaccia con un nome dire Shape con un metodo astratto draw e Triangle, Circle, Square classi che stanno implementando l'interfaccia Shape. Dopodiché non ti interessa quale forma verrà dopo. Puoi dire al tuo metodo drawNext(Shape s) un'istanza di Shape e chiamare il metodo di disegno per quello. Funzionerà per tutti i tipi che stanno implementando Shape.

public void drawNext(Shape s) 
{ 
    s.draw(); //this will call draw() method of Square if you call drawNext(new Square()) and draw() method of Triangle in case drawNext(new Triangle()) and so on.. 
} 

Se non si utilizza questa interfaccia si deve scrivere metodo diverso per tutti i tipi di oggetti drowable (drawSquare(Square s), drawCircle(Circle c) ecc ...)

Questo è uno degli ambiti di interfacce.

3

Java non consente l'ereditarietà multipla.

La loro decisione progettuale era di implementare le interfacce.

Quindi è possibile definire il comportamento desiderato in un'interfaccia e richiedere alla classe di implementarlo.
Questa classe può estendere qualsiasi altra classe (solo 1) e implementare tutte le interfacce necessarie.

3

Una classe può implementare molte interfacce e pertanto può fornire un "handle" diverso alla classe in questione. Questo è il modo in cui le classi sono considerate come polimorfiche (possono avere molte forme a seconda di come le si fa riferimento).

Dai un'occhiata alla documentazione del tutorial java a riguardo. Alcuni esempi utili sono;

L'ultimo anello è grande in termini di venire alle prese con le collezioni in Java e come si utilizzano le interfacce per fornire la loro funzionalità.

2

interface s sono cruciali in java perché non ha 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 interface.

Quindi, se avete bisogno di più di 1 logica per essere implementato da una classe [che non è raro], non è possibile utilizzare solo abstract classi, dovrete usare interface s

4

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.

+0

+1 Ottimo esempio! – jmort253

10

Ecco dove ho capito il loro utilizzo quando ho letto su di loro:

dire che si riceve un lettore portatile come un dono. Quando si tenta di eseguire il lettore , non accade nulla --- il lettore richiede batterie. Quali batterie si inseriscono nel lettore? Fortunatamente, sul retro del lettore c'è la specifica, l'assembly This player requires two AA batteries.'' With this information, you can obtain the correctly sized components (the batteries) and fit them into the player. The completed funziona.

La specifica delle batterie del giocatore disco servito diverse utili scopi:

La specifica ha detto che l'utente quale componente deve essere montato al giocatore per garantire il corretto funzionamento. Le specifiche indicavano al produttore del lettore di dischi le dimensioni per costruire la camera della batteria del lettore e quale voltaggio e amperaggio usare nell'elettronica del lettore . Le specifiche hanno indicato al produttore della batteria le dimensioni, la tensione e l'amperaggio per costruire le batterie in modo che altre persone possano utilizzarle. . Questi tre fattori sono di per sé importanti, ma anche implicano che l'utente, il produttore del disco e il produttore della batteria non devono comunicare direttamente tra loro --- la specifica della batteria è tutto ciò che è necessario per ciascuna parte a esegue il proprio compito indipendentemente dagli altri due.

+0

Davvero un fantastico esempio !!! Grazie –

+2

Questo è un ottimo esempio. Si potrebbe pensare alle marche di batterie come a implementazioni concrete dell'interfaccia del tipo di batteria. Potresti pensare a Energizer, Duracell e Sony mentre implementano l'interfaccia AA. Le connessioni della batteria sono le stesse e l'uscita è la stessa, e ovviamente le dimensioni, ma il marchio e forse alcuni componenti interni sottili sono diversi. +1 – jmort253

2

Un po 'di storia aiuta:

Il modello di oggetti in Java è praticamente una versione semplificata del C++ uno. Che ha sofferto del "problema dei diamanti" di fronte all'ereditarietà multipla.

In java, mentre 1 classe può estendere solo una classe base, può implementare più interfacce. Quando 2 o più metodi in quelle interfacce implementate hanno la stessa firma (nome, numero di parametro e tipi), il programmatore ne sarà coscientemente consapevole E nel peggiore dei casi (nel caso in cui dimentichi di implementare metodi) il loro comportamento sarà per default restituire null o non fare nulla (questo è ciò che gli IDE fanno per te comunque). Con l'ereditarietà multipla, devi sempre essere consapevole di non sovrascrivere i metodi delle classi base.

Questo approccio all'idea di interfacce funziona bene con il volto che tutti i metodi in Java sono di default virtuali. Questo costrutto dell'interfaccia è quindi il modo in cui java gestisce l'ereditarietà multipla e ottiene una certa pressione dal programmatore.

2

Sì, un'interfaccia è costituita da metodi astratti e variabili finali e viene utilizzata come un contratto generalizzato, in modo che le classi che lo implementano implementino i metodi descritti.

Tuttavia, questo non è l'unico uso/ambito di un'interfaccia. Questa è la definizione di un'interfaccia.

Le interfacce vengono utilizzate dove è noto in anticipo che un numero qualsiasi di classi sconosciute potrebbe eseguire il lavoro, purché presentino tutti un insieme di comportamenti standardizzati. Pertanto, se ho un oggetto Telefono e desidero consentire a qualcuno di ascoltarlo, potrei scrivere un listener telefonico che spiega come un telefono possa segnalare oggetti che non sono ancora stati scritti (e quindi non hanno una specifica classe concreta).

Spesso nella tua programmazione potresti fornire una (o più) lezioni concrete; ma, un'interfaccia è un segnale che questo è un punto di estensibilità pianificata. Per tornare al mio esempio di classe Telephone, potrei scrivere nella classe Telephone.

(assume that listeners is a Collection of TelephoneListener) 

public void addListener(TelephoneListener listener) { 
    listeners.add(listener); 
} 

private void simulateCall() { 
    for (TelephoneListener listener : listeners) { 
    listener.onRing(); 
    } 
} 

segnalazione di elenchi telefonici che non sono stati ancora scritti (ancora) che squilla un telefono.

Non è "solo" simulare l'ereditarietà multipla, sebbene quelli provenienti da uno sfondo C++ lo identificano come un mezzo per "risolvere" l'ereditarietà multipla. Si tratta di specificare un contratto per le future classi da implementare. L'ereditarietà multipla di C++ confonde il contratto con l'implementazione (e quindi corri il rischio del temuto schema a rombi).

5

Ti darò un esempio.

di avere una classe auto

class Car{ 
     start(){ 
      //code 
     } 
     stop(){ 
      //code 
     } 
    } 

e si desidera una super vettura che deve rimbalzare (ma caratteristica Bounceable appartiene alla sfera/gomma)

Ecco tua Super Car può implementare bounceable

public interface Bounceable{ 

     bounce(); 
    } 

Ora hai un'auto Super Car che può rimbalzare.

class SuperCar extends Car implements Bounceable{ 
     //My Super Car will bounce. 
    } 
+1

Ottimo esempio! +1 per usare un aggettivo per le tue interfacce! – jmort253

0

Un'ampia esempio è:
linguaggio Java Specification [interfaccia, contratto] dalla comunità Java
Attuazione da fornitori diversi, come Sun/Oracle JDK, IBM JDK, OpenJDK ecc