Leere vererbte Interface-Methoden

BoGJav

Neues Mitglied
Hallo,

die Frage in kurz: Wie gehe ich mit leeren vererbten Interface-Methoden um? Sollte ich lieber eine abstrakte Klasse nutzen?

die Frage mit Kontext:


Ich programmiere aktuell einen HTTP-Server. Jede mögliche URL (z.B. /home oder /login) hat ihren eigenen ContextHandler (z.B. HomeContextHandler oder LoginContextHandler). Alle ContextHandler haben eine Gemeinsamkeit: z.B. das Senden einer Antwort. Aus diesem Grund gibt es eine Elternklasse. Diese heißt ganz kreativ: ContextHandler. Diese Klasse erkennt auch, welche HTTP-Methode aufgerufen wurde und startet die jeweilige Methode (onPost(), onGet(), onTrace(), onHead() usw.). Diese Methoden sind, für die Übersichtlichkeit, in einem Interface (HttpMethodsHandler) definiert. Die ContextHandler Klasse implementiert dieses Interface und die Erben des ContextHandlers müssen die jeweiligen Methoden implementieren.
Jetzt das Problem: nicht alle ContextHandlers Erben brauchen alle Methoden von HttpMethodsHandler, da manche HTTP-Methoden nicht unterstützt werden.
Z.B. braucht /home keine Post-Methode.
Da aber alle Interface-Methoden implementiert werden müssen, taumeln die mit einem lehren Body in meinen ContextHandlers rum. Das stört mich zwar nicht, aber gibt es eine bessere Lösung?

Ich wünsche Euch noch einen schönen Abend.
 

White_Fox

Top Contributor
Vielleicht ist Vererbung einfach das falsche Werkzeug, und vielleicht wäre z.B. ein Strategiemuster und ein paar statische Methoden eine bessere Lösung.

Nur mal so aus der Hüfte geschossen.
 

Robert Zenz

Top Contributor
Deine eigentliche Frage ist eine andere, naemlich: Was soll passieren wenn die nicht benoetigten Methoden aufgerufen werden?

Nehmen wir mal folgende Schnittstelle an:

Java:
public interface Actions {
    public abstract String performK();
    public abstract String performL();
    public abstract String performQ();
}

Wenn wir jetzt eine Klasse wollen welche nur die Aktion "L" kann wuerde das so aussehen:

Java:
public class LOnlyActions implements Actions {
    @Override
    public String performK() {
        return null;
    }
   
    @Override
    public String performL() {
        return "Logic went here";
    }
   
    @Override
    public String performQ() {
        return null;
    }
}

Nun stellt sich die Frage "Was soll passieren wenn die Nicht-Implementierten Methoden aufgerufen werden?", in diesem Fall retournieren wir einfach null, aber das kann gut oder auch nicht sein. Das kommt immer darauf an was genau man will. Oft wird auch eine UnsupportedOperationException geworfen:

Java:
public class LOnlyActions implements Actions {
    @Override
    public String performK() {
        throw new UnsupportedOperationException("Action K is not implemented.");
    }
   
    @Override
    public String performL() {
        return "Logic went here";
    }
   
    @Override
    public String performQ() {
        throw new UnsupportedOperationException("Action Q is not implemented.");
    }
}

Wenn man jetzt sehr viele Implementationen von Actions hat, und diese immer nur eine oder zwei Methoden brauchen, muss man das Konstant wiederholen, um dies abzumildern kann man sich eine abstrakte Klasse definieren:

Java:
public abstract class AbstractActions implements Actions {
    @Override
    public String performK() {
        throw new UnsupportedOperationException("Action K is not implemented.");
    }
   
    @Override
    public String performL() {
        throw new UnsupportedOperationException("Action L is not implemented.");
    }
   
    @Override
    public String performQ() {
        throw new UnsupportedOperationException("Action Q is not implemented.");
    }
}

Dann kann man die eigentlichen Implementierungen etwas rauscharmer haben:

Java:
public class LOnlyActions extends Actions {
    @Override
    public String performL() {
        return "Logic went here";
    }
}

Aber die eigentliche Frage ist halt immer: Was soll passieren wenn die nicht implementierten/unterstuetzten Funktionen aufgerufen werden?
 

httpdigest

Top Contributor
In diesem Fall würde ich Interface Default Methoden verwenden. Wenn ein HTTP-Verb bzw. eine HTTP Methode von einem Handler nicht unterstützt wird, ist das sinnvollste, hier den HTTP Status Code 405 "Method Not Allowed" zurückzugeben:
Java:
public interface HttpMethodsHandler {
  default void onGet(HttpResponseWriterOrWhatever w) {w.sendStatus(405);}
  default void onPost(HttpResponseWriterOrWhatever w) {w.sendStatus(405);}
  default void onPut(HttpResponseWriterOrWhatever w) {w.sendStatus(405);}
  default void onPatch(HttpResponseWriterOrWhatever w) {w.sendStatus(405);}
  default void onHead(HttpResponseWriterOrWhatever w) {w.sendStatus(405);}
  default void onOptions(HttpResponseWriterOrWhatever w) {w.sendStatus(405);}
  default void onDelete(HttpResponseWriterOrWhatever w) {w.sendStatus(405);}
  ...
}
Das kann ja immer der Default sein.
 
Zuletzt bearbeitet:

Robert Zenz

Top Contributor
Stimmt, ich vergesse immer dass es default Methoden gibt.

Setzt aber voraus man kann die Schnittstelle aendern, klang jetzt in dem Thema nicht so.
 

httpdigest

Top Contributor
Wieso Schnittstelle ändern? Die Schnittstelle besteht ja einfach nur aus den Methoden für die einzelnen http Verben.
Und die einzelnen Handler implementieren nur die Methoden, die sie unterstützen. Der Rest behält ihre Default Implementierung.
Ich sehe da noch keine Änderung einer Schnittstelle.
 

BoGJav

Neues Mitglied
Danke für Eure schnellen und ausführlichen Antworten!

Deine eigentliche Frage ist eine andere, naemlich: Was soll passieren wenn die nicht benoetigten Methoden aufgerufen werden?
Darum kümmert sich mein ContextHandler. Dieser liest die Methode und gibt entweder einen "Not implemented 501" oder "Method not allowed 405" Fehler zurück an den Client. Entschuldigung, das habe ich vergessen in meine Frage reinzuschreiben.

Wenn man jetzt sehr viele Implementationen von Actions hat, und diese immer nur eine oder zwei Methoden brauchen, muss man das Konstant wiederholen, um dies abzumildern kann man sich eine abstrakte Klasse definieren
Daran habe ich auch schon gedacht. Ich habe aber Zugriff auf die Schnittstelle, weswegen ich das Interface ändern kann. Könnte ich die Schnittstelle nicht ändern, wäre das die beste Möglichkeit.

In diesem Fall würde ich Interface Default Methoden verwenden. Wenn ein HTTP-Verb bzw. eine HTTP Methode von einem Handler nicht unterstützt wird, ist das sinnvollste, hier den HTTP Status Code 405 "Method Not Allowed" zurückzugeben
Davon habe ich noch nie gehört. Scheint aber eine schöne Lösung zu sein. Danke vielmals.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T PDF-Generierung (itext) - läuft unter Eclipse, bei har aber leere Seite Allgemeine Java-Themen 39
H ArrayList: Leere Elemente finden? Allgemeine Java-Themen 2
KaffeeFan FileWriter nur leere Zeilen beschreiben Allgemeine Java-Themen 3
R Leere Verzeichnisse löschen Allgemeine Java-Themen 11
B LEERE JTable MouseListener + popupmenu Allgemeine Java-Themen 2
127.0.0.1 StringBuffer leere Zeile löschen Allgemeine Java-Themen 8
L leere Konsoleneingabe Allgemeine Java-Themen 10
T Drucken von variabel langen Listen (es kommen nur leere Seiten raus) Allgemeine Java-Themen 2
nrg Leere Objektreferenz mit != null vergleichen Allgemeine Java-Themen 4
G POI: Leere Zelle nimmt keinen Type an Allgemeine Java-Themen 8
R ANT Jar Task soll leere Verzeichnisse ignorieren..? Allgemeine Java-Themen 3
G Leere Datei mit PrintWriter trotz flush und close Allgemeine Java-Themen 8
E JExcel- Zugriff auf leere Zellen kommt eine Fehlermeldung Allgemeine Java-Themen 6
G Leere Fenster (Keine Schrift, Reiter/ Buttons) bei Java Allgemeine Java-Themen 5
V Class Document seltsam leere Zeile am Anfang Allgemeine Java-Themen 8
H Leere Tabelle initialisieren Allgemeine Java-Themen 2
B wie behandelt man leere textfelder Allgemeine Java-Themen 11
OnDemand Interface imlementieren Allgemeine Java-Themen 4
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

Ähnliche Java Themen

Neue Themen


Oben