2016-12-27 4 views
0

ich eine Liste von Objekten, die MarkerInterface implementieren:Wie kann man überprüfen, ob ein Objekt ein Feld hat

List<MarkerInterface> list = new ArrayList<>(); 

Je nach Datei ich hinzufügen Person, Motorradfahrer oder Hund auf die Liste Objekte. Diese Klassen implementieren MarkerInterface.

list.add(person); 

oder

list.add(dog); 

oder

list.add(biker); 

Einige dieser Klassen Unterklassen haben: Dog1 erstreckt Hund, Dog2 erstreckt Hund, ... Einige Klassen haben parentId Feld, andere doesn t.

Ich möchte überprüfen, ob ein Objekt ParentId-Feld hat oder nicht und drucken Sie seinen Wert, wenn es existiert. Wie geht das? Ich habe versucht:

list.get(i).getParentId(); 

aber es wird nicht funktionieren, weil MarkerInterface können haben getParentId() -Methode nicht (nicht alle Klassen, die MarkerInterface implementieren parentId Feld).

+3

Sie brauchen eine andere Schnittstelle wie 'MarketWithParent extends MarketInterface' wo' getParent' definiert wird und Sie dann 'instanceof' –

+1

Java reflection verwenden können? http://tutorials.jenkov.com/java-reflection/fields.html – ThisClark

+1

@ThisClark. Technisch gesehen wäre OP besser dran, nach "getParent_id" als Methode und nicht als Feld zu suchen. Es besteht eine gute Chance, dass das Feld für eine gut gestaltete Klasse privat ist. –

Antwort

1

Was möchten Sie drucken, wenn das Feld parent_id nicht vorhanden ist?

Sie können dies erreichen, indem Sie das Objekt abfragen, um zu sehen, ob es das Feld enthält - beispielsweise indem Sie Java Reflection verwenden, um die Felder des Objekts zu untersuchen. Oder, wie Lashane in Kommentaren vorschlägt, könnten Sie eine andere Schnittstelle hinzufügen und instanceof verwenden. Aber ich würde Sie ermutigen, über andere Ansätze nachzudenken, weil das explizite Überprüfen der Felder einer Klasse oder das Abfragen ihrer Laufzeittypen oft ein Zeichen für ein Designproblem ist, das Sie später vielleicht wieder beißen könnte.

Eine Alternative wäre das Hinzufügen einer Methode zu der Schnittstelle, die die zu druckende Zeichenfolge zurückgibt. Sie könnten eine Standardimplementierung haben, die "" (oder was auch immer Sie anstelle der Parent-ID ausgeben würden. Daher führte ich mit dieser Frage), und dann in Basisklassen, die eine Eltern-ID einführen, könnten Sie mit einer Implementierung überschreiben, die die Eltern-ID zurückgibt .

(By the way, es sollte wohl parentId vereinbarungs geschrieben werden, aber das ist vielleicht die Frage nicht wichtig ...)

Sie könnten dann die Klassenhierarchie organisieren wollen, so dass alles, was parent_id hat bekommt es (und die überschriebene Implementierung, die es zurückgibt) durch eine gemeinsame Elternklasse; das kann oder kann nicht praktisch für Ihre Bedürfnisse sein. Wenn dies nicht der Fall ist, gibt es komplexere Muster, die Sie verwenden könnten, um die Codeverdopplung zu minimieren, aber das könnte für den Umfang der Frage etwas zu tief sein.

+0

schreiben Und dann: eine Zeichenfolge ist eine ziemlich schlechte Wahl für etwas so wichtig wie eine ID. Es könnte auch besser sein, an einen spezifischen ID-Typ, auch Klasse, zu denken. – GhostCat

+0

Das ist wahr; Ich habe nichts gesehen, was den ID-Typ identifiziert hätte, also habe ich einfach angenommen, dass es für Druckzwecke in eine Display-Zeichenkette umgewandelt würde ... –

+0

Ich werde id in einigen Operationen verwenden, die ich jetzt überspringe. – Agnieszka

0

Wie Sie empfohlen haben, habe ich ParentIdInterface erstellt, das MarkerInterface erweitert und die getParentId() -Methode verwendet.

if(list.get(i) instanceof ParentIdInterface) { 
    ParentIdInterface pi = (ParentIdInterface) list.get(i); 
    ... 
} 

Jetzt funktioniert es genau, wie ich wollte. Vielen Dank.

0

Wenn Sie Java Reflexion verwenden, und Sie haben so etwas wie dies in den Klassen:

public int parentId = 3; 

Sie den Wert wie folgt zu erreichen:

try { 
     Field f = list.get(i).getClass().getField("parentId"); 
     int value = f.getInt(this); 
     System.out.println("parentId="+value); 
    } catch (NoSuchFieldException | SecurityException | IllegalArgumentException| IllegalAccessException e) { 
     System.out.println("no Field named parentId"); 
    } 

aber ich würde empfehlen Schnittstellen wie die anderen schon sagten.

Verwandte Themen