Umfang der Nützlichkeit der Schnittstelle in Java

8

Schnittstellen bestehen aus abstrakten Methoden und endgültigen Variablen. Nun, es wird als generalisierter Vertrag verwendet, so dass Klassen, die ihn implementieren, den Regeln folgen sollten, indem sie Methoden implementieren.

Ist dies der nur / scope der Schnittstelle in Java? Haben sie dafür nur das Konzept der Schnittstelle eingeführt, oder fehlt mir etwas? Bitte helfen Sie mir, die Verwendung von Schnittstellen mit Beispielen zu verstehen. (Nicht wie man Interfaces benutzt oder erstellt, sondern wie sie Programmierern helfen).

Danke.

    
Anuj Balan 25.01.2012, 07:58
quelle

11 Antworten

3

Der Hauptzweck von Schnittstellen besteht darin, Programmierern, die bestimmtes Verhalten in einer implementierenden Klasse implementieren müssen, als Leitfaden zu dienen.

Wenn Sie beispielsweise eine Queue-Klasse implementieren möchten, die die List-Schnittstelle implementiert, müssen Sie beispielsweise die add-Methode und eine remove-Methode für die List-Schnittstelle implementieren.

%Vor%

Wenn Ihre Warteschlange die List-Schnittstelle implementiert, müssen Sie eine eigene Version der Methoden add und remove implementieren. Der Hauptvorteil der Verwendung einer Schnittstelle besteht darin, dass Sie einen Typ mit einem anderen austauschen können. Zum Beispiel:

%Vor%

ODER

%Vor%

Wenn Sie Ihre Klasse als Schnittstelle implementieren, können Sie Ihre Variablen mit einem allgemeineren Typ deklarieren, als wenn Sie einen konkreten Typ verwenden würden. Ich finde, dass dies bei einem Bean oder einem Datenübertragungsobjekt, bei dem eine Serviceklasse eine ArrayList verwendet, aber bei einem anderen möglicherweise von der Verwendung eines HashSets profitiert, wirklich hilfreich ist. In meiner Bean kann ich die Interface-Deklaration verwenden und jede Service-Klasse bestimmen lassen, welchen konkreten Typ sie verwenden möchte, indem sie die Variable auf den konkreten Typ umsetzt.

Interfaces sind im Grunde eine Möglichkeit, Dinge zu standardisieren und den Austausch einer implementierenden Klasse mit einer anderen zu erleichtern.

Ich finde auch, dass sie mir helfen, bestimmte Methoden zu implementieren, wenn ich etwas programmiere, da ich sie zuerst im Interface beschreiben kann, und dann erinnert mich der Compiler daran, sie zu implementieren.

    
jmort253 25.01.2012, 08:10
quelle
10

Hier habe ich ihre Verwendung verstanden, als ich sie zum ersten Mal gelesen habe:

  

Sagen Sie, dass Sie einen tragbaren CD-Player als Geschenk erhalten. Wenn Sie es versuchen   betreibe den Spieler, nichts passiert - der Spieler benötigt Batterien.   Welche Batterien passen in den Player? Zum Glück, auf der Rückseite des   player ist die Spezifikation, 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 assembly '' operiert.

     

Die Spezifikation der Batterien des CD-Players diente mehreren nützlichen   Zwecke:

     

In der Spezifikation wurde dem Benutzer mitgeteilt, welche Komponente in die   Spieler, um den korrekten Betrieb sicherzustellen. Die Spezifikation sagte der   Hersteller des Disc-Players, welche Größe er für den Player hat   Batteriekammer und welche Spannung und Stromstärke innerhalb der zu verwenden   Elektronik des Spielers. Die Spezifikation teilte dem Batteriehersteller mit   welche Größe, Spannung und Stromstärke, um Batterien zu bauen, damit andere es können   benutze sie. Diese drei Tatsachen sind an sich wichtig, aber auch sie   implizieren, dass der Benutzer, der CD-Hersteller und die Batterie   Hersteller müssen nicht direkt miteinander kommunizieren --- die   Für jede Party ist nur die Spezifikation der Batterie erforderlich   unabhängig von den anderen beiden eine eigene Aufgabe ausführen.

    
isah 25.01.2012 08:16
quelle
5

Ich werde dir ein Beispiel geben.

Sie haben eine Autoklasse

%Vor%

Und Sie wollen ein Super Car, das prallen muss (aber Bouncable-Funktion gehört zu Ball / Gummi)

Hier kann Ihr Super Car bouncable

implementieren %Vor%

Jetzt haben Sie Super Car Auto, das hüpfen kann.

%Vor%     
Jayy 25.01.2012 08:48
quelle
4

Wie Sie gesagt haben, werden Schnittstellen verwendet, um Verträge anzugeben, welche Klassen, die sie implementieren, folgen müssen. Die Szenarios, in denen sie verwendet werden, sind normalerweise ein Szenario, in dem Sie eine Klasse aufrufen, die eine bestimmte Schnittstelle implementiert. Die Tatsache, dass die Implementierungen einer bestimmten Schnittstelle Ihnen das Wissen vermitteln, dass diese gegebene Klasse tatsächlich eine bestimmte Menge von Methoden implementiert. Normalerweise interessiert es Sie nicht, was in diesen Methoden passiert. Was Ihnen wichtig ist, ist, dass die Klasse diese Methoden hat.

Als Beispiel möchten Sie vielleicht das Beobachterdesignmuster betrachten. Im Grunde haben Sie ein Objekt, das einen Status hat, den es mit anderen Objekten teilt, und gibt ihnen Benachrichtigungen, wenn sich einige seiner Daten ändern.

Also, wenn zum Beispiel alle Beobachter die folgende Schnittstelle implementieren:

%Vor%

Das Subjekt kann, ohne etwas zu wissen, was auch immer über seine Beobachter ist, so etwas tun:

%Vor%

Wie Sie sehen, hat die Klasse MySubject keine Kenntnis davon, wie der Observer die Methode notify implementiert, was es wirklich interessiert, ist, dass sie es implementiert. Auf diese Weise können Sie verschiedene Beobachter erstellen, die auf unterschiedliche Weise ihre eigene notify -Klasse implementieren können, ohne dass Änderungen in der Klasse MySubject erforderlich sind.

Schnittstellen erlauben auch bestimmte Arten von Sicherheit. Schnittstellen sind normalerweise auch nützlich, wenn Sie eine Reihe von Klassen haben, die eine Reihe ähnlicher Verhaltensweisen implementieren, die Sie normalerweise in einer typsicheren Datenstruktur speichern möchten. Dies ist normalerweise eine gute Arbeit um die Tatsache, dass Java keine Mehrfachvererbung zulässt. In dem oben angegebenen Beispiel kann ich also eine unbegrenzte Anzahl verschiedener Klassen haben. Solange sie jedoch die Schnittstelle Observer implementieren, können sie alle derselben Liste hinzugefügt werden.

In den notifyAll -Methoden kann ich nur die Elemente der Liste iterieren, anstatt zu prüfen, ob das Element einen bestimmten Typ hat, und es dann umwandeln, was bei der Programmausführung zusätzlichen Aufwand verursachen kann.

    
npinti 25.01.2012 08:15
quelle
3

Java erlaubt keine Mehrfachvererbung.

Ihre Designentscheidung war die Implementierung von Schnittstellen.

Sie können also das gewünschte Verhalten in einer Schnittstelle definieren und von Ihrer Klasse implementieren lassen.
Diese Klasse kann jede andere Klasse (nur 1) erweitern und so viele Schnittstellen wie nötig implementieren.

    
Cratylus 25.01.2012 08:09
quelle
3

Eine Klasse kann viele Schnittstellen implementieren und daher der betreffenden Klasse ein anderes "Handle" zur Verfügung stellen. Auf diese Weise werden Klassen als polymorph betrachtet (sie können viele Formen haben, je nachdem, wie Sie sie referenzieren).

Sehen Sie sich dazu die Java-Tutorial-Dokumentation an. Einige nützliche Beispiele sind;

Der letzte Link ist großartig, wenn es darum geht, sich mit Sammlungen in Java vertraut zu machen und wie sie Schnittstellen nutzen, um ihre Funktionalität bereitzustellen.

    
Mr Moose 25.01.2012 08:12
quelle
3

Es ist ein klassisches Beispiel, aber trotzdem. Zum Beispiel möchten Sie ein Spiel schreiben, wo Kreise, Quadrate, Dreiecke und andere Formen sein sollen. Sie wissen nicht, welche Form beim nächsten Mal kommen wird, also sollten Sie eine Schnittstelle mit einem Namen sagen Shape mit einer abstrakten Methode draw und Triangle , Circle , Square Klassen, die Ihre implementieren Shape Schnittstelle. Danach ist es dir egal, welche Form als nächstes kommt. Sie können Ihrer Methode drawNext(Shape s) eine Instanz von Shape geben und die draw-Methode dafür aufrufen. Es funktioniert für alle Typen, die Shape implementieren.

%Vor%

Wenn Sie diese Schnittstelle nicht benutzen, müssen Sie eine andere Methode für alle Arten von schlürfbaren Objekten schreiben ( drawSquare(Square s) , drawCircle(Circle c) etc ...)

Dies ist einer der Bereiche der Schnittstellen.

    
shift66 25.01.2012 08:09
quelle
2

interface s sind in Java entscheidend, da keine Mehrfachvererbung hat. Wenn Sie möchten, dass Ihre Klasse Iterable ist, aber Sie auch eine bestimmte Logik implementieren möchten, können Sie nicht von 2 Klassen erben, daher müssen Sie interface verwenden.

Wenn Sie also mehr als eine Logik benötigen, die von einer Klasse implementiert wird [was nicht ungewöhnlich ist], können Sie nicht nur abstract -Klassen verwenden, sondern auch interface s

    
amit 25.01.2012 08:12
quelle
2

Ein bisschen Geschichte hilft:

Das Objektmodell in Java ist eine vereinfachte Version von C ++. Das litt unter dem "Diamantproblem", wenn es mit Mehrfachvererbung konfrontiert wird.

In Java kann eine Klasse, die immer nur eine Basisklasse erweitern kann, mehrere Schnittstellen implementieren. Wenn 2 oder mehr Methoden in diesen implementierten Schnittstellen die gleiche Signatur (Name, Parameternummer und Typen) haben, wird sich der Programmierer bewusst sein, dass UND im schlimmsten Fall (falls er vergisst, Methoden zu implementieren) wird sein Verhalten voreingestellt Null zurückgeben oder nichts tun (das tun IDEs sowieso für Sie). Bei Mehrfachvererbung müssen Sie immer darauf achten, die Methoden der Basisklassen nicht zu überschreiben.

Diese Annäherung an die Idee von Schnittstellen funktioniert gut mit dem Gesicht, dass alle Methoden in Java standardmäßig virtuell sind. Dieses Interface-Konstrukt ist also die Art und Weise, wie Java mit Mehrfachvererbung umgeht und etwas Druck vom Programmierer bekommt.

    
vlad-ardelean 25.01.2012 08:19
quelle
2

Ja, eine Schnittstelle besteht aus abstrakten Methoden und endgültigen Variablen und wird als generalisierter Vertrag verwendet, so dass die implementierenden Klassen die beschriebenen Methoden implementieren sollten.

Dies ist jedoch nicht der einzige Verwendungszweck einer Schnittstelle. Das ist die Definition einer Schnittstelle.

Schnittstellen werden dort verwendet, wo es im Voraus bekannt ist, dass eine beliebige Anzahl unbekannter Klassen die Aufgabe erfüllen kann, vorausgesetzt, dass sie alle ein standardisiertes Verhalten aufweisen. Wenn ich also ein Telefon-Objekt habe und jemandem erlauben möchte, es anzuhören, schreibe ich vielleicht einen Telefon-Listener, der angibt, wie ein Telefon Objekte signalisieren kann, die noch nicht geschrieben wurden (und daher keine bestimmte konkrete Klasse haben).

Oft können Sie in Ihrer Programmierung eine (oder mehrere) konkrete Klassen angeben; aber eine Schnittstelle ist ein Signal, dass dies ein Punkt der geplanten Erweiterbarkeit ist. Um zu meinem Telefonklassenbeispiel zurückzukehren, schreibe ich vielleicht in die Telefonklasse.

%Vor%

Signalisierung TelefonListeners, die noch nicht einmal (noch) geschrieben wurden, dass ein Telefon klingelte.

Es ist nicht wirklich "nur" die Simulation der Mehrfachvererbung, obwohl diejenigen, die aus einem C ++ - Hintergrund kommen, es als ein Mittel zum "Lösen" der Mehrfachvererbung identifizieren. Es geht darum, einen Vertrag für zukünftige Klassen zu definieren. Die mehrfache Vererbung von C ++ verwechselt den Vertrag mit der Implementierung (und damit riskieren Sie das gefürchtete Rautenmuster).

    
Edwin Buck 25.01.2012 08:25
quelle
0

Ein breites Beispiel ist:
Java-Sprachspezifikation [Schnittstelle, Vertrag] von der Java-Gemeinschaft
Implementierung durch verschiedene Hersteller wie Sun / Oracle JDk, IBM JDK, OpenJDK usw.

    
Java Geek 15.02.2014 21:08
quelle

Tags und Links