Prüfen von direkter Implementierung eines Interfaces

Stonie

Mitglied
Hallo Forum,

In einem bestehenden Kontext, an dem ich leider nichts ändern kann, ist folgendes umgesetzt:
Es gibt diverse Klassen die Interfaces implementieren. Die Interfaces vererben von einander.
Bspw.
* InterfaceA
* InterfaceB extends InterfaceA
* InterfaceC extends InterfaceB

Mein Algo soll die verschiedenen Klassen anhand des Interfaces filtern. Da die vollstände Vererbung der Interfaces sich jederzeit ändern kann und heute schon über 5 Ebenen hat, suche ich quasi nach einer Art (also idealerweise ohne Reflections) zu prüfen ob eine Klasse direkt ein Interface implementiert (und nicht erst in 2. oder 3. Vererbungsstufe).

Also bswp. ein Stückchen Code in der Form

if (obj instanceof InterfaceB) then { ... } else if (obj instanceof InterfaceA) then { ... }

ist schnell geschrieben, aber die instanceof Anweisungen fangen oft auch mehr, als mir lieb ist. Beispielsweise fängt das obj instanceof InterfaceB auch InterfaceC mit, was ich so in dem Kontext nicht brauchen kann. In Realität gliedern sich hier die Interfaces auch nicht so linear auf, sondern mehrfach baumartig. Da ich aber nicht sicherstellen kann, das es mit der nächsten Version des Frameworks nicht auch noch ein InterfaceD geben kann, empfinde ich einen Code nicht sehr elegant per Code die nicht gewollten Interfaces auszuschließen.

Vielleicht habt ihr da eine Idee.

VG;
 
K

kneitzel

Gast
Suchst Du evtl. nach obj.getClass().getGenericInterfaces()?
"Returns the Types representing the interfaces directly implemented by the class or interface represented by this object."

Dadurch bekommst Du nur direkt implementierte Interfaces. Aber meines Wissens nach auch nicht die Interfaces, die evtl. eine SuperKlasse implementiert hat.
 

Stonie

Mitglied
ich mach das Beispiel mal anschaulicher. Sagen wir mal die Interfaces "markieren" einen Typ.
EinfachesBauteil --> BesseresBauteil --> LuxusBauteil
die Interfaces vererben von einander. Im Code bekomme ich hier eine Collection von Objekten hingeworfen, welche die Interfaces implementieren. Der Filter soll mir bspw. nur (ausschließlich) die "BesseresBauteil" zurückgeben ohne über die Vererbung "EinfachesBauteil" mit einzufangen. Eine Lösung könnte so aussehen, die funktioniert auch - aber ich empfinde den Code unelegant, besonders wegen der for-Schleife über die Interfaces. Aber es kann auch gut sein, das es nicht Besser geht.

Java:
// Diese Collection soll abgearbeitet werden
for (Object inputObject : inputListe) {

  for (Type interfaceFromObject : inputObject.getClass().getGenericInterfaces()) {
    if (BesseresBauteil.class.equals(interfaceFromObject )) {
      // diese inputObject merken, da es ein BesseresBauteil ist.
      break;
     }
   }
    
}

Ich konnte übrigens keinen Unterschied zwischen getGenericInterfaces() und getInterfaces() feststellen. Wo liegt der Unterschied?

Viele Grüße
 

mihe7

Top Contributor
Der Filter soll mir bspw. nur (ausschließlich) die "BesseresBauteil" zurückgeben ohne über die Vererbung "EinfachesBauteil" mit einzufangen.
Wenn interface BesseresBauteil extends EinfachesBauteil gilt, dann kannst Du ja ganz einfach über instanceof BesseresBauteil die jeweiligen Instanzen ermitteln.
 

mrBrown

Super-Moderator
Mitarbeiter
Die Interface-Hierarchie lässt sich absolut nicht anpassen?
Wenn man sowas machen muss, spricht das meist nicht für das Design...


Ich konnte übrigens keinen Unterschied zwischen getGenericInterfaces() und getInterfaces() feststellen. Wo liegt der Unterschied?
Ersteres gibt generische Typen zurück, letzteres nur Raw-Types
 

Barista

Top Contributor
InterfaceA
* InterfaceB extends InterfaceA
* InterfaceC extends InterfaceB

Nach InterfaceB und nach InterfaceB kannst Du direkt über instanceof fragen,

Bei InterfaceA würde ich fragen:

Java:
if (obj instanceof InterfaceA && ( ! ( (obj instanceof InterfaceB) || (obj instanceof InterfaceC))))
 

Stonie

Mitglied
Hallo Zusammen,

danke für Eure Hilfe und Ideen.

@mrBrown Du hast recht. Ich empfinde das auch nicht sehr clever. In anderen Teilen der API hat der Hersteller diesen Aufbau auch besser umgesetzt. Da gibt es dies Generalisierungen über Interfaces zwar auch, aber die "Entknoten" im Interface-Hirarchie-Baum haben nochmal jeweils exakt zugeordneten Typen. Da geht dann eine Prüfung über instanceof problemlos. Diese Software wird zugekauft und kann leider nicht so leicht beeinflusst werden. Es gibt ja auch andere Kunden als uns.

@Barista Dein Snippet unten trift meine aktuelle Umsetzung, aber die Interface-Hierarchie kann wachsen und dann arbeitet der Code plötzlich fehlerhaft. (was genau so passiert ist) Daher war ich mit dieser, meiner ersten, Umsetzung auch unzufrieden.

@kneitzel Ursprünglich wollte es es verhindern über Java Reflections zu gehen. Man weiß ja nie ob nicht irgendwann irgendwelche Security-Konfigurationen den Code zu Fall bringen. Aber dieser Teil sicher weniger häufig von Änderungen betroffen. Du bestätigst meine Vermutung das dies der richtige weg ist.

Vielen Dank euch allen und ein schönes Wochenende,
Stonie
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
8u3631984 Prüfen ob min. ein Element eines Sets in einem anderen Set enh Allgemeine Java-Themen 4
OnDemand Prüfen ob Bild defekt ist Allgemeine Java-Themen 4
N Prüfen, ob ein String 2x das selbe Zeichen hat Allgemeine Java-Themen 10
W Classpath Reflexion - Prüfen ob man auf ein Feld ändern kann Allgemeine Java-Themen 2
OnDemand Bild prüfen ob defekt Allgemeine Java-Themen 3
B Java Mail: Prüfen, ob Email hat ein Anhang oder nicht Allgemeine Java-Themen 2
Bluedaishi Prüfen ob Datei noch geöffnet ist Allgemeine Java-Themen 59
J Mit Lombok Integer Range prüfen Allgemeine Java-Themen 6
S Prüfen ob Textfile existiert Allgemeine Java-Themen 9
E Programm auf Installation prüfen Allgemeine Java-Themen 1
S Binärbaum prüfen Allgemeine Java-Themen 0
L String auf zahlenwert prüfen Allgemeine Java-Themen 13
W Datum prüfen + zweistellig Allgemeine Java-Themen 11
perlenfischer1984 Functionsparameter prüfen und eine Exception werfen !? Allgemeine Java-Themen 11
Z Java Exceptions - Auf leeres Feld prüfen Allgemeine Java-Themen 10
F Wie kann ich auf einem System prüfen, ob eine lib verfügbar ist? Allgemeine Java-Themen 2
P Prüfen ob es Variable mit Namen gibt der als String übergeben wird Allgemeine Java-Themen 7
M .jar nach Datei prüfen Allgemeine Java-Themen 2
B Existenz eines Files max 30 sec prüfen Allgemeine Java-Themen 5
B Prüfen, ob ein Element in der Liste nicht existiert Allgemeine Java-Themen 3
F Cardlayout prüfen ob schon vorhanden, keine doppelten Allgemeine Java-Themen 3
turmaline Regex gegen Regex prüfen Allgemeine Java-Themen 4
S Lambda Ausdrücke: @FunctionalInterface Instanzen auf null prüfen Allgemeine Java-Themen 9
D ArrayList index auf gültigkeit prüfen Allgemeine Java-Themen 12
C Best Practice [Arrays] Wie sinnvoll prüfen, ob Array primitive Datentypen enthält? Allgemeine Java-Themen 6
L Prüfen, ob Programm über 32bit oder 64bit Java ausgeführt wird Allgemeine Java-Themen 4
K Methoden Arrays auf true Werte prüfen Allgemeine Java-Themen 4
Y Prüfen ob ein Graph immer einen von mehren Enden erreicht Allgemeine Java-Themen 4
O Prüfen ob String eine Zahl mit maximal 2 Nachkommastellen ist Allgemeine Java-Themen 4
M datei aufruf prüfen Allgemeine Java-Themen 9
D Best Practice Prüfen ob jar nachträglich geändert wurde Allgemeine Java-Themen 2
B Dateien prüfen auf Gleichheit Allgemeine Java-Themen 5
H String auf Zahlen prüfen Allgemeine Java-Themen 4
T auf Valides Datum prüfen Allgemeine Java-Themen 12
N Java Version Prüfen lassen Allgemeine Java-Themen 11
S Variablen Prüfen ob Number vom Typ Integer, Float, Double, ... ist Allgemeine Java-Themen 2
E selber Klassen kompilieren/ prüfen Allgemeine Java-Themen 5
O Variablen Originalname einer übergebenen Variable prüfen Allgemeine Java-Themen 9
T Methoden Zahlenpalindrom laufzeitoptimiert prüfen Allgemeine Java-Themen 4
U ResourceBundles auf vollständigkeit prüfen Allgemeine Java-Themen 2
C jollyday: prüfen, ob Datum = Feiertag Allgemeine Java-Themen 8
C Prüfen ob sich ein Punkt innerhalb einer Kugel befindet (Java3D,nicht-lineare GLS) Allgemeine Java-Themen 5
M Objekt prüfen auf null ->Invocation Target Exception??? Allgemeine Java-Themen 2
E Prüfen ob Fenster mit Namen offen ist Allgemeine Java-Themen 2
M Binärbaum auf vollständigkeit prüfen Allgemeine Java-Themen 4
S Mail Adressen Syntax prüfen Allgemeine Java-Themen 22
O Text mit Wildcard gegen regulären Ausdruck prüfen Allgemeine Java-Themen 3
N List auf null prüfen Allgemeine Java-Themen 2
B generischen Typ prüfen Allgemeine Java-Themen 7
D prüfen, ob Enums bestimmte Elemente enthalten Allgemeine Java-Themen 3
N Prüfen ob Methode ausgeführt wird und diese ggf. abbrechen? Allgemeine Java-Themen 8
B Prüfen ob ein Programm gestartet wurde Allgemeine Java-Themen 23
N ArrayList nach Reihenfolge prüfen Allgemeine Java-Themen 2
C Prüfen auf Zahl und 6 stellig fehlerhaft? warum? Allgemeine Java-Themen 7
D Wie prüfen, ob ein String Teil eines Enum Types ist? Allgemeine Java-Themen 12
H Prüfen, ob doppete Werte in int-Array vorhanden sind Allgemeine Java-Themen 16
data89 Bilder mit Java prüfen - suche dringend Hilfe Allgemeine Java-Themen 8
S Prüfen auf Hex-Wert fester Länge! Allgemeine Java-Themen 5
M Prüfen, welche anderen Programme laufen Allgemeine Java-Themen 5
K Zip dateien prüfen Allgemeine Java-Themen 3
G ZIP Archiv auf Konsistenz prüfen Allgemeine Java-Themen 2
T Parameter einer Klasse auf Interface prüfen Allgemeine Java-Themen 6
L Passwort mit Regulärem Ausdruck prüfen Allgemeine Java-Themen 6
P Sound Buffer prüfen Allgemeine Java-Themen 12
B PrintService - Wie prüfen ob Drucker online ist? Allgemeine Java-Themen 2
A Textfeld prüfen, ob ein Punkt eingegeben wurde Allgemeine Java-Themen 8
flashfactor Prüfen ob bereits eine Instanz gestartet ist Allgemeine Java-Themen 2
C Prüfen, ob eine Methode eine andere überschreibt! WIE? Allgemeine Java-Themen 8
T Prüfen, ob Char ein Quantifier ist Allgemeine Java-Themen 6
N Prüfen ob Objekt in Liste enthalten ist Allgemeine Java-Themen 17
G Prüfen welche JRE-Version gebraucht wird Allgemeine Java-Themen 19
J Mit Patternmatching einen Satz prüfen Allgemeine Java-Themen 12
G Prüfen ob Ziffern einer Zahl pandigital sind? Allgemeine Java-Themen 15
M Prüfen ob Variable vorhanden / initalisiert ist Allgemeine Java-Themen 4
J Wie prüfen ob eine Datei vom OS fertig geschrieben wurde? Allgemeine Java-Themen 6
TheJavaKid Zeile auf existenz von String prüfen. Allgemeine Java-Themen 19
A Weshalb man Parameter auf Gültigkeit prüfen sollte Allgemeine Java-Themen 6
N Prüfen ob ein String in einen Integer umgewandelt werden kan Allgemeine Java-Themen 4
O String auf zahlen prüfen (java 1.3) Allgemeine Java-Themen 4
G Datei Zugriffsrechte prüfen Allgemeine Java-Themen 2
Linad Bilder auf Gleichheit prüfen Allgemeine Java-Themen 6
G ResultSet auf Inhalt prüfen? Allgemeine Java-Themen 2
H Prüfen, ob es sich um ein Integer handelt Allgemeine Java-Themen 4
C String str prüfen Allgemeine Java-Themen 3
H Prüfen ob ein String grösser als 4 Zeichen ist Allgemeine Java-Themen 3
F Prüfen, ob Windows oder UNIX Allgemeine Java-Themen 2
K Interface Eingabefenster mit direkter Ergebnisausgabe und Bestätigung Allgemeine Java-Themen 2
L Unterschied zwischen List und LinkedList implementierung? Allgemeine Java-Themen 15
boschl2000 Springerproblem-Implementierung funktioniert nicht richtig Allgemeine Java-Themen 1
L rotateLeft implementierung Allgemeine Java-Themen 2
R In der Ausgabe sollte anstelle des obersten Sterns ein "+" stehen nur scheitere ich bei der Implementierung Allgemeine Java-Themen 9
D Input/Output Implementierung eines CommandHandlers/Parsers für viele Eingaben Allgemeine Java-Themen 26
S Mutable objects und Implementierung von ChangeEvents Allgemeine Java-Themen 5
W Queue Implementierung Allgemeine Java-Themen 6
C Ein Iterator ist eine Implementierung des Interface Iterable? Allgemeine Java-Themen 2
F Implementierung von Teilprogrammen [Java|Python] Allgemeine Java-Themen 7
I TimSort - Sortieralgorithmus - Erklärung und Pseudocode - Implementierung Allgemeine Java-Themen 2
L Implementierung eines AVT-Baums Allgemeine Java-Themen 2
ruutaiokwu burstsort-implementierung in java? Allgemeine Java-Themen 2
D Implementierung einer Mehrsprachigkeit, wichtig ? Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben