Interface

Stefan Dreis

Mitglied
Interfaces beschreiben ja Schnittstellen. Mich würde jetzt mal interssieren wie Interfaces anständig benutzt werden von euch. Schreibt ihr in Interfaces alle public Funktionen der Implementierten Klasse rein? Also z.B.

Code:
interface MyInterface {
              public funcA();
              public funcB();
              public funcC();
}

class MyClass implements MyInterface {
                public funcA();
                public funcB();
                public funcC();
}

oder doch eher nur die Funktionen auf die von anderen Klassen drauf zugriffen wird. z.B. im folgenden Beispiel wird z.B. ( aus was für Gründe auch immer ) die funcC zwar nur intern verwendet, aber bewusst nicht als protected gekennzeichnet

Code:
interface MyInterface {
              public funcA();
              public funcB();
}

class MyClass implements MyInterface {
                public funcA();
                public funcB();
                public funcC();
}

public MyCallClass {
          public myfunc() {
                    MyClass.funcA();
                    ...
                    MyClass.funcB();
           }
}

Und wie ist in der Praxis die übliche Benennung einer Interface und eine von einem Interface abhängigen Klasse? So z.B.

Code:
interface User {
}

class UserImpl extends User {
}

In einigen Beispielen habe ich ferner gesehen (da java ja Namespaced Datenstrukturen hat) das in einer die Package in der obersten Schicht die Interface Dateien beinhaltet und in untergeordneten Verzeichnis die eigentlichen klassen also wie z.B.

- Personenverzeichnis ( Dateiverzeichnis )
--- Person.java ( Interface Klasse)
--- User.java ( Interface Klasse )
-------- Impl ( Dateiverzeichnis )
------------ PersonImpl.java ( eigentliche Implementierungs Klasse )
------------ UserImpl.java ( eigentliche Implementierungsklasse )

Ist das in Firmen eine übliche Orderstruktur?
 
Zuletzt bearbeitet von einem Moderator:
N

nillehammer

Gast
oder doch eher nur die Funktionen auf die von anderen Klassen drauf zugriffen wird.
Ja, eher so. Aufgrund der Tatsache, dass Klassen mehrere Interfaces implementieren können, kann man jedes Interface tendenziell eher schmal halten (weniger Methoden). Denn je mehr Methoden (die möglicherweise garnicht gebraucht werden) ein Interface definiert, desto schwieriger wird es für einen Implementierer.
- Personenverzeichnis ( Dateiverzeichnis )
--- Person.java ( Interface Klasse)
--- User.java ( Interface Klasse )
-------- Impl ( Dateiverzeichnis )
------------ PersonImpl.java ( eigentliche Implementierungs Klasse )
------------ UserImpl.java ( eigentliche Implementierungsklasse )

Ist das in Firmen eine übliche Orderstruktur?
Nenn die Verzeichnisse packages und schreib sie mit kleinem Anfangsbuchstaben, dann ist das durchaus eine übliche Vorgehensweise.
 
Um den richtigen Umgang mit Interfaces zu verstehen sollte man sich erst einmal angucken, was Interfaces ausmacht, worin sie ihre Sträken haben... z.B. gegenüber abstract Classes

Vorteile:
-Mehrfachvererbung Möglich
-Man kann Programmierer dazu zwingen Methoden zu programmieren

Nachteile:
-Alle Methoden eines Interfaces müssen immer komplett neu implementiert

Wichtig hier bei ist wie immer, eine ordentliche Bezeichnung der Klassen, Methoden, Interfaces, etc..

Und wie ist in der Praxis die übliche Benennung einer Interface und eine von einem Interface abhängigen Klasse?
Java:
Code:

interface User {
}

class UserImpl extends User {
}

Zunächst einmal extends ist hier falsch >implements< müsste da stehen. Desweiteren kannst du auch über Subinterfaces ein normales Interface erweitern. Näheres kannst du in z.B. Java ist eine Insel lesen.

Hier der Link:
Java ist auch eine Insel – 6.11 Schnittstellen
 
G

Gonzo17

Gast
Zur Benennung der Klassen: Ich hab auch schon öfter gesehen, dass das Interface mit einem I beginnt, also zB IBird und die konkreten Klassen, die dieses Interface implementieren, dann "normale" Namen wie Duck oder Pigeon. Ob das jetzt so üblich ist, kann ich aber nicht beurteilen. Ich finde, dass beides in Ordnung ist.
 
N

nillehammer

Gast
Gonzo17 hat gesagt.:
Ob das jetzt so üblich ist, kann ich aber nicht beurteilen. Ich finde, dass beides in Ordnung ist.
Ja, das ist genauso üblich, wie das andere. Viele Open Source Projekte (ich glaub u.a. auch Eclipse) benutzen diese Konvention. In einer großen Logistikfirma, für die ich gearbeitet habe, wurde auch diese Konvention verwendet. Ich denke auch, dass beides in Ordnung ist, mir gefällt das erste aber besser. Mich nerven die großen Is ;-))
 

tfa

Top Contributor
Ja, das ist genauso üblich, wie das andere. Viele Open Source Projekte (ich glaub u.a. auch Eclipse) benutzen diese Konvention. In einer großen Logistikfirma, für die ich gearbeitet habe, wurde auch diese Konvention verwendet. Ich denke auch, dass beides in Ordnung ist, mir gefällt das erste aber besser. Mich nerven die großen Is ;-))

Ja, hauptsächlich ist das in der Eclipse-Welt Konvention (und C#). Allerdings gibt keinen Grund, warum man ein I vor alle Interface-Namen schreiben sollte. Ganz im Gegenteil. Die Lösung mit "interface User" und "UserImpl" ist eindeutig besser.
 
G

Gonzo17

Gast
@maki

Hm, das was dort erklärt wird macht irgendwie Sinn. Zumal es ja tatsächlich so ist, dass jede IDE auch anzeigt, ob es ein Interface oder eine Klasse ist.
 
M

maki

Gast
Ja Gonzo17, ich kann diese Argumentation auch gut nachvollziehen.

Das hat aber einen Nachteil:
Man muss die Problemdomäne gut kennen & verstehen, sonst findet man keine so gute Namen ;)
 

tfa

Top Contributor
Es gibt Stimmen die behaupten, dass IInterface und InterfaceImpl beide gleich schlecht sind.
Sicherlich problematisch (wenn einem was anderes einfällt als "Impl"-Suffix, ist das natürlich noch besser), aber gleich schlecht würde ich nicht sagen. Im Quelltext schreibe und lese ich die Interface-Typen jedenfalls sehr viel häufiger als die Impl-Typen. Und da stört ein "I" doch ziemlich.
 
T

Tomate_Salat

Gast
Threads zu diesem Thema gibt es zuhauf hier im Forum. Letztendlich ist es imho Geschmackssache wie man etwas löst.
 
M

maki

Gast
Das I kenne ich in java auch nur von Eclipse RCP & Konsorten, ist mir sonst nie untergekommen.
Das Impl dagegen habe ich schon öfters gesehen, scheint üblicher zu sein.

Naja, muss zugeben, das ich mich hab schon "zwingen" lassen beides gleichzetiig zu machen, also I fürs Interface und gleichzeitig und Impl für die Implementierung... war nicht meine Entscheidung, aber ich war jung und brauchte das Geld... ;)
 

flopalko

Bekanntes Mitglied
Mit dem ImplSuffix könnte ich doch jedes Interface nur ein mal implementieren? o_O
Bzw was wäre die Namenskonvention für ein Interface Vogel mit 2 implementierenden Klassen?
 
G

Gast2

Gast
Ich glaub nicht dass irgendwo jemand geschrieben hat dass man Implementierungen immer
Code:
<interface>Impl
nennen sollte ;)
 

flopalko

Bekanntes Mitglied
Könntest du mir bitte erläutern, warum ich ein Interface verwenden sollte, das nur von einer Klasse implementiert wird. Außer bei einer einfachen Implementierung des Observer Patterns als Uni-Hausaufgabe habe ich noch nie ein Interface nur mittels einer Klasse implementiert...
 
Zuletzt bearbeitet:

Sulamamb

Neues Mitglied
Hi,

ersteinmal sind die Methoden eines Interfaces immer public, auch ohne Zugriffsmodifizierer.

FangFrage: Macht es Sinn eine Methode in einem Interface private zu deklarieren?

Zur Bennung kann man das Interface mit I beginnen. z.B. IUser und die Klasse dann User, ist halt ne stilsache die jeder für sich entscheiden muss.

Interfaces zu benutzen macht Sinn, wenn man sich Instanzen eines Typs über eine Fabrikmethode hohlt. Dass heißt dass irgendwo in meinem Programm von einer externen Schnittstelle eine Klasse bereitgestellt wird, die je nach Anforderung eine Instanz einer Klasse erzeugt die das Interface implementiert.

Bsp.: Das Paket java.sql Hier gibt es eine Klasse Connection. Um jetzt z.B. eine Datenbankabfrage durchführen zu können benötigt man eine Instanz des Interfaces Statement. Da aber für jede unterschiedliche Datenbank die implementierende Klasse ganz anders aufgebaut ist/Ansprüche hat, definiert man durch das Interface die Funktionalitäten die jede Datenbankinteraktion bereitstellen sollte. Die Instanz der Klasse Statement wird durch den entsprechenden Treiber erzeugt/fabriziert.
Connection.createStatement (Fabrikmethode). In deinem Programm hast du die ganze Zeit über nur ein Interface deklariert mit dem dur arbeitest. Da drin befindet sich eine konkrete Klasse die uns ja auch völlig egal sein kann. Ferner gibt die Methode executeQuery des Interfaces Statement wieder ein Interface zurück nämlich das ResultSet. Auch hier wieder das gleiche Prinzip. In deinem Programm arbeitest du die ganze Zeit nur mit einer als Interface deklarierten Variable.

Für die Klasse User ist es nicht unbedingt sinnvoll vorher ein Interface zu deklarieren...
 
G

Gonzo17

Gast
Mit dem ImplSuffix könnte ich doch jedes Interface nur ein mal implementieren? o_O
Bzw was wäre die Namenskonvention für ein Interface Vogel mit 2 implementierenden Klassen?

Ich glaube du hast da was falsch verstanden. Du kannst doch einfach frei nach EikeB's Beispiel folgendes machen:

interfaces Vogel
class SpechtImpl implements Vogel
class HabichtImpl implements Vogel

Es geht - meinem Verständnis nach - nicht darum, dass man zwingend den Interface-Namen wiederverwendet, sondern mehr darum, dass man erkennt was ein Interface und was eine Klasse ist.


Könntest du mir bitte erläutern, warum ich ein Interface verwenden sollte, das nur von einer Klasse implementiert wird. Außer bei einer einfachen Implementierung des Observer Patterns als Uni-Hausaufgabe habe ich noch nie ein Interface nur mittels einer Klasse implementiert...

Entsprechend auch hier, natürlich macht ein Interface mit nur einer Implementierung keinen Sinn.
 
M

maki

Gast
Eine einzige Implementierung von einem Interface nutzt man in Java zB. um den Code testfähig zu halten wie bei TDD.
Das findet man auch häufiger, liegt IMHo an ein paar Einschränkungen von Java, konkrete Klassen/Methoden mocken kann zB. unter OSGi problematisch werden wenn diese Methoden zB. final sind.
 

tfa

Top Contributor
Auch wenn man nur eine Implementierung eines Interfaces persönlich schreibt, heißt das nicht, dass es nur eine gibt. Zum Beispiel bei AOP oder Client/Server-Architekturen werden oft synthetische Proxy-Klassen erzeugt, die das Interface implementieren.
 
M

maki

Gast
Hm, könntest du mir da ein konkretes Beispiel sagen?
Kein konkretes Beispiel, TDD konkret wäre eben Testgetrieben zu entwickeln ;)

Bei TDD fängt man mit dem Test an, die Klasse/Methoden oder allgemein den Code der getestet wird schreibt man danach ;)
Für Kolaborateure, also andere Objekte/Klassen welche die zu testende Klasse nutzt (Abhängigkeiten), verwendet man nur ein Interface (Mock Roles, not Objects!) welches gemockt wird, so isoliert man den Code der zu testen ist von code, den man nicht testen möchte .
So vermeidet man zB. ein echtes RDBMS zu benötigen wenn man zB. code testet, der ein DAO nutzt, das DAO wird gemockt und keine echte DB ist nötig.

Andere Sprachen können auch ohne extra Interface und Framework mocken, aber in Java sind Interfaces zum Mocken noch am besten geeignet, da man damit eben die Schnittstelle von der Implementierung entkoppelt.

Genaugenommen müsste man dann auch sagen, dass die Mocks eben alternative Implementierungen des Interfaces sind, aber nur zum testen genuzt werden.
 
G

Gonzo17

Gast
Jetzt verstehe ich was du meinst. Ja, das hab ich durchaus auch schon so verwendet. In einem kleinen E-Mail-Client, den ich mit ATDD/TDD entwickelt habe, hatte ich das Interface MailServer, bei den Tests wurde ein FakeMailServer verwendet, der eben nur so tut als würde er Mails liefern, und in der Anwendung selbst gibt es dann verschiedene (reale) Implementierungen davon.

Aber wie du sagst, da macht man die Schnittstelle ja auch nicht nur für eine Implementierung, denn zumindest beim Testen wird das Interface nochmal genutzt.
 


Schreibe deine Antwort... und nutze den </> Button, wenn du Code posten möchtest...
Ähnliche Java Themen
  Titel Forum Antworten Datum
I No Jakarta Enterprise Beans found with interface ignorieren? Java Basics - Anfänger-Themen 2
I No EJB found with interface of type Java Basics - Anfänger-Themen 12
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
Say Abstrakt oder Interface Java Basics - Anfänger-Themen 3
Say public/default Interface Java Basics - Anfänger-Themen 9
D Interface Methode wird ungewollt in der Subklasse überschrieben Java Basics - Anfänger-Themen 5
W Intuitive interface für Komponenten Java Basics - Anfänger-Themen 4
I Browser integriert in Desktop Applikation - Webcam interface not found Java Basics - Anfänger-Themen 26
U Beispiel Methode size() vom "Collection"-interface... Wie kann man sichtbar machen, was die Methode unter der Haube macht? Java Basics - Anfänger-Themen 8
J Interface Comparable<T> Java Basics - Anfänger-Themen 10
M Interface oder Vererbung? Java Basics - Anfänger-Themen 12
D Interface Verständisfrage Java Basics - Anfänger-Themen 8
U Interface | constructor injection Java Basics - Anfänger-Themen 5
J Interface Interface korrekt implementieren Java Basics - Anfänger-Themen 5
A Methoden Vererbung und Interface Java Basics - Anfänger-Themen 14
T Interface Map und Map.Entry Java Basics - Anfänger-Themen 4
U Interface als PAramter (Vergleich) und ein Error Java Basics - Anfänger-Themen 9
I Interface von einer EJB Klasse, um Code zu reduzieren Java Basics - Anfänger-Themen 1
M Interface als Parameter einer Klasse Java Basics - Anfänger-Themen 8
M Wie kann ich eine Methode aus einem Interface in eine Klasse implementieren, so dass sie ihre Funktion ausführt? Java Basics - Anfänger-Themen 7
I JSON und Interface Java Basics - Anfänger-Themen 3
Kotelettklopfer Kleines Testprogramm mit Interface und einer Usereingabe Java Basics - Anfänger-Themen 16
J Interface methode aufrufen (interface parameter) Java Basics - Anfänger-Themen 7
CptK Interface Functional interface mit mehreren Methoden Java Basics - Anfänger-Themen 6
L Interface & Comparable Java Basics - Anfänger-Themen 15
T Interface Java Basics - Anfänger-Themen 0
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
B Interface List - Objekt übergeben? Einzelnes Objekt geht, aber Liste nicht? Java Basics - Anfänger-Themen 4
B Best Practice Unschlüssig ob Vererbung oder Interface Java Basics - Anfänger-Themen 2
E abstrakte Klasse implementiert ein Interface Java Basics - Anfänger-Themen 40
C Interface und Konstruktor Java Basics - Anfänger-Themen 1
S Interface Equals und hashCode Java Basics - Anfänger-Themen 16
A Generische Klassen/Interface Java Basics - Anfänger-Themen 1
C Methoden-Parameter ist Interface Java Basics - Anfänger-Themen 5
B Collections Objektreferenz-ID in der Ausgabe (Comparator Interface) Java Basics - Anfänger-Themen 2
A Interface Kuddelmuddel Java Basics - Anfänger-Themen 4
C Collections List über Interface zugreifen Java Basics - Anfänger-Themen 32
S Interface Interface und seine Implementierung Java Basics - Anfänger-Themen 5
H abstract und interface Java Basics - Anfänger-Themen 4
F Interface Casting Java Basics - Anfänger-Themen 13
C Telefonliste mit interface implementieren Java Basics - Anfänger-Themen 30
L Klassen Kann eine Unterklasse einer abstrakten Klasse ein Interface implementieren? Java Basics - Anfänger-Themen 2
H Interface Java Basics - Anfänger-Themen 2
R Quicksort mit Interface Comparable Java Basics - Anfänger-Themen 6
T Interface Methode im Interface mit mehreren Parametern Java Basics - Anfänger-Themen 10
B Interface vs Abstract Java Basics - Anfänger-Themen 2
B Objekte zählen/ Vererbung/ Kopplung/ Interface/ Abstract Class Java Basics - Anfänger-Themen 5
pkm Interface Funktionales Interface lässt sich nicht implementieren. Java Basics - Anfänger-Themen 2
Kornblume Comparable Interface für Objektvergleiche nutzen Java Basics - Anfänger-Themen 15
I Comparator<T> Interface als Methodenparamter Java Basics - Anfänger-Themen 4
J OOP Wie sollte ich das organisieren (Abstract? Interface?) Java Basics - Anfänger-Themen 33
J Java Interface/abstrakte Klassen Java Basics - Anfänger-Themen 2
E Interface nur von abstrakter Klasse implementierbar?! Java Basics - Anfänger-Themen 1
J Vererbung Abstrake Klasse <-> Interface Java Basics - Anfänger-Themen 5
C Interface als Datentyp eines Attributes? Java Basics - Anfänger-Themen 6
U Interface Bedeutung "Code to an interface rather than to an implementation." Java Basics - Anfänger-Themen 4
M Erste Schritte Prüfungsbeispiel: Interface / abstrakte Klassen Java Basics - Anfänger-Themen 8
M Maven Main-Methode Interface und Klasse Java Basics - Anfänger-Themen 2
R Interface Eigene Objekte in Listen sortieren mit Interface Comparable Java Basics - Anfänger-Themen 5
D Interface Amazon Skill Kit, Interface but method in other class? Java Basics - Anfänger-Themen 3
A Interface Abstrakte Interface Methode kann nicht benutzt werden Java Basics - Anfänger-Themen 10
J Compiler-Fehler class interface or enum expected Java Basics - Anfänger-Themen 1
T Vererbung und interface. Java Basics - Anfänger-Themen 1
N Interface Interface Erstellung Java Basics - Anfänger-Themen 3
kilopack15 Beziehung Interface - (abstrakte) Klasse -Unterklasse Java Basics - Anfänger-Themen 3
C Interface Fragen zum Interface Java Basics - Anfänger-Themen 7
Azazel Ist die abstract class das selbe wie ein interface ? Java Basics - Anfänger-Themen 33
K Interface: wie damit arbeiten Java Basics - Anfänger-Themen 4
lBlKha0s Fehlermeldung : class interface or enum expected Java Basics - Anfänger-Themen 9
T error: class, interface, or enum expected Java Basics - Anfänger-Themen 5
T Vererbung Interface Java Basics - Anfänger-Themen 5
F Interface aus anderem Package nutzen Java Basics - Anfänger-Themen 10
N Interface Daten einem Implementierten Interface zuweisen Java Basics - Anfänger-Themen 37
B Erste Schritte Wie definiere ich in Java ein Interface? Java Basics - Anfänger-Themen 6
L OOP Interface Prinzip? Java Basics - Anfänger-Themen 6
K Nutzung einer Klasse die das Iterator-Interface implementiert Java Basics - Anfänger-Themen 0
K Iterator-Interface implementieren mit Exception Handlung Java Basics - Anfänger-Themen 1
J Innerhalb Interfacemethode: Interface als Attribut Java Basics - Anfänger-Themen 2
A Frage zu Interface Java Basics - Anfänger-Themen 16
J Interface Java Basics - Anfänger-Themen 3
W Interface Java Basics - Anfänger-Themen 1
L Compiler-Fehler error: class, interface or enum expected Java Basics - Anfänger-Themen 2
G Interface java.util.Comparator: Wieso muss nur die Methode compare() implementiert werden Java Basics - Anfänger-Themen 2
N Generics Vererbung Wildcard Interface Java Basics - Anfänger-Themen 8
Shams Kann man von einem Interface aus auf die dieses implementierende Klasse zugreifen? Java Basics - Anfänger-Themen 4
S Generische Methode soll Objekte als Parameter erlauben die bestimmtes Interface implementieren^ Java Basics - Anfänger-Themen 9
J Frage zu dem Thema interface Java Basics - Anfänger-Themen 5
S Generics und Comparable Interface Java Basics - Anfänger-Themen 5
A Klasse,Vererbung,Interface,Singleton,Thread Java Basics - Anfänger-Themen 5
S Interface-Methode abrufen? Java Basics - Anfänger-Themen 2
G Vererbung Klasse erbt von abstrakter Klasse implementiert Interface Java Basics - Anfänger-Themen 2
M Konstanten in einem Interface definieren Java Basics - Anfänger-Themen 1
P interface Java Basics - Anfänger-Themen 1
F eigenes Listener Pattern mit Interface Java Basics - Anfänger-Themen 1
M Interface als Datentyp Java Basics - Anfänger-Themen 12
K Interface Methoden überschreiben Java Basics - Anfänger-Themen 1
C Klassendesign / Wann Interface implementieren und wann Klassen vererben? Java Basics - Anfänger-Themen 3
A Interface in Collection (Liste) angeben Java Basics - Anfänger-Themen 2
G Interface klasse Java Basics - Anfänger-Themen 4
N Interface Interface (sinnvoll) erzeugen Java Basics - Anfänger-Themen 8

Ähnliche Java Themen


Oben