Interface imlementieren

OnDemand

Top Contributor
Hallo zusammen,

ich glaube ich hab im Code was gefunden wo sich bestens ein Interface eignet, dazu aber ein paar Fragen. @KonradN du hast im Thread "cleanCode" so schön zu den Interfaces geantwortet, hast Lust zu antworten? ;)

Aktuell folgendes:

nehmen wir an es gibt 3 CMS systeme an welche Daten aus meiner App geschickt/geholt werden. Für alle 3 Systeme mache ich: Daten holen, Daten senden, Daten löschen, Daten updaten.

Nun habe ich 3 Klassen (Quarzjobs) für jedes CMS eine eigene (weil sich die Implentierung ja unterscheidet, jedes hat ne andere API). Hier wäre doch ein Interface "CMSClientInterface" ideal mit den 4 Methoden send, get, put, delete Meine aktuellen 3 Klassen implementieren dann das Interface.

So was macht das jetzt aber für einen Sinn? Wenn ich eine Funktion erweitere, muss ich das Interface um eine Methode ergänzen. Vielleicht aber brauch ich das nur in CMS2, trotzdem muss ich das in allen InterfaceImpl einbauen, den Methodenbody dann leer lassen? Den einzigen Vorteil den ich sehe ist, dass wenn ich ein neues CMS einbaue und mit dem IF erweitere, dann vergesse ich nicht irgendwelche Funktionen einzubauen.

Freue mich über Feedback
 

Oneixee5

Top Contributor
Das Interface soll nur die Methodensignaturen bereitstellen, welche immer implementiert werden müssen. Ein Interface könnte auch default Methoden enthalten, diese müssen nicht jedes mal überschrieben werden. Genauso wäre es möglich abstrakte Klassen zu verwenden, die alle Methoden bereitstellen aber die Methoden leer (z.B. in Swing) oder mit einer NotImplementedException implementiert. Dann wäre man nur gezwungen die Methoden zu überschreiben, welche auch genutzt werden. Das wird z.B. bei Collections ( List.of() ) manchmal gemacht, etwa um eine unveränderliche Liste zu erzeugen, die aber trotzdem dem List-Interface entspricht.
Einen Sinn macht das aber m.E. nur, wenn deine Quartz-Jobs so generisch sind, dass sie auch mit verschieden implementierten Interfaces etc. umgehen können. Falls jeder Quartz-Jobs sowieso eine spezielle Implementierung hat dann erzeugst du einfach nur zusätzliche Komplexität.
 

OnDemand

Top Contributor
Danke! Auf jeden Fall hat jeder Quartz Job 5 Methoden die in jedem Job gleich sind. Dies sind Methoden welche die Daten aus der db holen und dann an die CM/S weiter gibt.

Diese 5 Methoden machen in jedem Job exakt das gleiche, die kann ich also schon mal auslagern
 

Robert Zenz

Top Contributor
Nun habe ich 3 Klassen (Quarzjobs) für jedes CMS eine eigene (weil sich die Implentierung ja unterscheidet, jedes hat ne andere API). Hier wäre doch ein Interface "CMSClientInterface" ideal mit den 4 Methoden send, get, put, delete Meine aktuellen 3 Klassen implementieren dann das Interface.
Das klingt, spontan, nach zu spezifischen Methoden fuer die Schnittstelle. Du willst eigentlich immer relativ vereinfachte Methoden bereitstellen komplett ohne Implementierungsdetails, so dass du nie in die Verlegenheit kommst dass die Schnittstelle angepasst werden muss, weil sich eine konkrete Implementierung aendert. Denke da mehr in Arbeitsablaeufen, also in konkreten Handlungen.

So was macht das jetzt aber für einen Sinn?
Der Sinn ist dass der verwendende Code drei unterschiedliche, fremde Systeme anfragen kann ohne das man diesen aendern muss,

Java:
for (DataProvider dataProvider : registeredDataProviders) {
    Data data = dataProvider.fetchData();
    backend.save(data);
}

Da spielt es jetzt keine Rolle ob ich einen oder hunderte Quellen habe, ob diese einmal einen REST-API im Internet abfragen oder eine 3,5" Diskette ueber einen Praktikanten der das Ding mit einem Messgeraet ausliest.

Wenn ich eine Funktion erweitere, muss ich das Interface um eine Methode ergänzen. Vielleicht aber brauch ich das nur in CMS2, trotzdem muss ich das in allen InterfaceImpl einbauen, den Methodenbody dann leer lassen?
Zum Beispiel. Eine andere Moeglichkeit sind Erweiterungen wie sie Eclipse verwendet:

Java:
public interface DataProvider {
    public Data fetchData();
}

public interface DataProviderBetterDataExtension {
    public BetterData fetchBetterData();
}

public class FirstDataProvider implements DataProvider {
    public Data fetchData() {}
}

public class AnotherDataProvider implements DataProvider, DataProviderBetterDataExtension {
    public Data fetchData() {}
    public BetterData fetchBetterData() {}
}

for (DataProvider dataProvider : registeredDataProviders) {
    Data data = dataProvider.fetchData();
    backend.save(data);

    if (dataProvider instanceof DataProviderBetterDataExtension) {
        BetterData betterData = dataProvider.fetchBetterData();
        backend.save(betterData);
    }
}

Den einzigen Vorteil den ich sehe ist, dass wenn ich ein neues CMS einbaue und mit dem IF erweitere, dann vergesse ich nicht irgendwelche Funktionen einzubauen.
Ja, und du musst deine Logik nicht anpassen welche diese Schnittstelle verwendet, obwohl ein weiteres System hinzugekommen ist.
 

LimDul

Top Contributor
Eine Möglichkeit, wie man zu Interfaces kommen kann, ist rückwärst denken. Sprich, du hast sagen wir mal 3 Implementierungen ohne ein gemeinsames Interface.

Nun möchtest du an einer Stelle etwas gleichartiges mit allen Implementierungen tun ohne instanceof Abfragen einbauen zu müssen oder ähnliches. Dann ist klar für diese Anforderung brauchst du jetzt ein Interface, dass genau diese Methode bereitstellt.


Das ist im Endeffekt auch eine Ideen von Test Driven Development. Du baust da nicht von vornerein Interfaces. Die kommen durchs Refaktoring - weil man Duplizierungen ausbauen will - auf ganz natürliche Weise rein.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Leere vererbte Interface-Methoden Allgemeine Java-Themen 8
Buroto Interface Allgemeine Java-Themen 2
T Komische Zeichen im Zusammenhang mit Serializable interface Allgemeine Java-Themen 13
M Kann man Annotationen auf Klassen einschränken die ein Interface implementieren? Allgemeine Java-Themen 1
H Kombination Interface und Abstrakte Klasse bei Generics Allgemeine Java-Themen 3
B JaxB und @XmlIDREF mit Interface Allgemeine Java-Themen 1
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
P Abstrakte Klassen vs. Interface Allgemeine Java-Themen 4
Kirby.exe Autocloseable Interface Allgemeine Java-Themen 2
T Abgeleitetes Interface public ohne Schlüsselwort "interface"? Allgemeine Java-Themen 3
S static in Interface und Klasse Allgemeine Java-Themen 2
S static methode im Interface Allgemeine Java-Themen 1
S Interface, generischer Datentyp, Exception? Allgemeine Java-Themen 3
B Vererbung Interface und implementierende Klassen Allgemeine Java-Themen 8
A Anonyme Klassen - Interface Allgemeine Java-Themen 5
C Ein Iterator ist eine Implementierung des Interface Iterable? Allgemeine Java-Themen 2
J Generische Interface - Problem Allgemeine Java-Themen 3
mrBrown Namensfindung Fluent-Interface Allgemeine Java-Themen 0
J Logik in Interface Allgemeine Java-Themen 2
N Best Practice Allgemeines Verhalten für ein Interface implementieren? Allgemeine Java-Themen 7
B eigenes Consumer Interface Allgemeine Java-Themen 0
S 2 methoden mit gleichen namen und ein Interface Allgemeine Java-Themen 9
N GUI Interface, swing Allgemeine Java-Themen 7
Thallius Konzeptproblem User-Interface Allgemeine Java-Themen 5
T Interface vs abstract Allgemeine Java-Themen 2
S Klassen Abstract, Interface und ein Chat Tool Allgemeine Java-Themen 1
I Interface Interface / Klasse - wieso Abstract? Allgemeine Java-Themen 13
D generische Interface und konkrete Methode Allgemeine Java-Themen 3
C Klassen Problem mit Funktion einer Generischen Klasse die ein Interface implementiert Allgemeine Java-Themen 0
N Problem mit Generics und Interface Allgemeine Java-Themen 4
D Methode mit optionalen Parametern in Interface Allgemeine Java-Themen 3
T Interface mit generische Typen Allgemeine Java-Themen 5
M Interface einer Library implementieren Allgemeine Java-Themen 3
A Klassen ein Interface aufzwingen Allgemeine Java-Themen 4
Bananabert Interface Custom 'Event' mit Interface Allgemeine Java-Themen 10
J Interface Serializable Methodensignatur Allgemeine Java-Themen 2
J Interface Interface für Framework verwenden Allgemeine Java-Themen 4
F Interface IInterface oder Interface? Allgemeine Java-Themen 3
M Generics (bounded wildcards statt Interface Bezeichnern) -- Sinn oder Unsinn? Allgemeine Java-Themen 2
T Interface Probleme Allgemeine Java-Themen 8
M Queues und Queue Interface Allgemeine Java-Themen 3
I Mehrfaches Implementieren eines generischen Interface Allgemeine Java-Themen 9
W Java Native Interface und "mp3player" Allgemeine Java-Themen 3
M Über Liste verschiendene JComponents mit eigenem implementierten Interface ansprechen Allgemeine Java-Themen 7
P Eclipse Java Native Interface-Problem Allgemeine Java-Themen 8
Z Abstrakte Klassen /Interface Allgemeine Java-Themen 5
pg1337 Interface-Frage Allgemeine Java-Themen 24
S Interface Welchen Interface Stil favorisiert ihr? (usability) Allgemeine Java-Themen 17
faetzminator statische Variablen in Interface - Vererbung? Allgemeine Java-Themen 9
R Implementierung eines Interface durch 2 verschiedene Klassen Allgemeine Java-Themen 6
T OpenOffice Interface Elemente Ein/Ausblenden Allgemeine Java-Themen 5
K Interface Interface comparable machen Allgemeine Java-Themen 9
T Interface > Abstract > Class Allgemeine Java-Themen 11
N Trick für Compilerfehler bei fehlendem Interface Allgemeine Java-Themen 12
X Interface - Klasse einladen Allgemeine Java-Themen 6
G Interface -> InterfaceImplementierung Allgemeine Java-Themen 3
Ark Array durch Interface ersetzen Allgemeine Java-Themen 7
R Interface instanzieren Allgemeine Java-Themen 8
B Frage zu Interface und List Allgemeine Java-Themen 4
KrokoDiehl JNI: native im Interface Allgemeine Java-Themen 4
S normale vererbung als interface Allgemeine Java-Themen 2
E Beispiel für ein möglichst einfaches Interface Allgemeine Java-Themen 22
N Unterschied abstract interface und interface Allgemeine Java-Themen 4
S interface verbung problem Allgemeine Java-Themen 9
S problem programm mit interface: Allgemeine Java-Themen 3
R Vererbung mit Interface und Abstract Allgemeine Java-Themen 3
B Interface und von Thread ableiten Allgemeine Java-Themen 6
R Interface Serializable technische Begrenzung Allgemeine Java-Themen 2
T Interface-Referenz Allgemeine Java-Themen 2
L interface abstrakte klasse Allgemeine Java-Themen 21
S Interface Geschäftslokik & GUI Allgemeine Java-Themen 6
G Interface zwischen 2 Programmierern Allgemeine Java-Themen 10
C Schnittstellen(interface) Allgemeine Java-Themen 9
N List<? implements "Interface"> geht nicht Allgemeine Java-Themen 13
D javadoc interface + implementation + @overrides Allgemeine Java-Themen 16
G Interface oder abstrakte Klasse Allgemeine Java-Themen 4
T Parameter einer Klasse auf Interface prüfen Allgemeine Java-Themen 6
A feststellen, welche Klassen ein Interface implementieren Allgemeine Java-Themen 3
G class, interface, or enum exp? Allgemeine Java-Themen 2
S Interface Klasse überladen. Allgemeine Java-Themen 2
K Inneres Interface äußere Klasse Allgemeine Java-Themen 7
T Frage zu interface und "guter Programmierstil" Allgemeine Java-Themen 4
T Interface "on-the-fly" implementieren? Allgemeine Java-Themen 3
S Frage zu Interface Allgemeine Java-Themen 7
J Objektorientiert - Interface & Klassen Allgemeine Java-Themen 3
G Interface - Klassen implementieren das - Reflection ok? Allgemeine Java-Themen 4
T "Programming against the interface" sinnvoll? Allgemeine Java-Themen 18
G Interface mehrfach implementieren Allgemeine Java-Themen 5
@ zur Laufzeit Interface aus jar implementieren? Allgemeine Java-Themen 5
A Was ist der genau Sinn eines Interface? Allgemeine Java-Themen 13
E Oberbergriff für class und interface Allgemeine Java-Themen 20
D QuickSort, Interface Allgemeine Java-Themen 2
R Interface für Arithmethik? Allgemeine Java-Themen 3
MQue Interface implementieren Allgemeine Java-Themen 7
P Liste von Klassen die ein Interface implementieren speichern Allgemeine Java-Themen 12
L Interface Frage! Allgemeine Java-Themen 25
T Instanz einer Interface abgeleiteten Klasse erzeugen Allgemeine Java-Themen 3
F Ein interface und private Methoden? Allgemeine Java-Themen 13
G nichtabstrakte Funktion zu einer Interface hinzufügen Allgemeine Java-Themen 6
minzel Java Native Interface Allgemeine Java-Themen 9

Ähnliche Java Themen

Neue Themen


Oben