2016-04-24 2 views
0

Ich habe derzeit eine Methode, die ich schreiben:Argument Methode mit implementierten Schnittstellen

public boolean checkIfThere(FoodItem itemToSearchFor){ 
    // some code 
} 

Das Problem ist, dass FoodItem eine Schnittstelle und itemToSearchFor könnte entweder auf ein Objekt in meiner „Candies“ Klasse beziehen oder meine "Desserts" -Klasse. Meine Getränke sind ziemlich einfach. Sie enthalten eine Reihe von primitiven Daten wie String-Name, Int-Kosten usw. Aber meine Desserts haben Arrays in ihnen, die Süßigkeiten enthalten können.

Meine Frage ist dies: wenn der Benutzer das ItemToSearchFor Argument übergeben, würde ich nicht wissen, ob es eine Süßigkeit oder ein Nachtisch ist. Aber gibt es eine Möglichkeit für mich, auf das Array innerhalb von ItemToSearchFor zuzugreifen, wenn sich das Argument als Desserts herausstellt. Momentan kann ich nur auf die 4 Methoden zugreifen, die die beiden Klassen teilen, aufgrund ihrer Implementierung von FoodItem.

Danke.

Antwort

0

Es gibt mehrere Möglichkeiten, dies zu tun.

Erster Weg mit instanceof:

if(obj istanceof Obj){ 
//do something 
} 
else if(obj instanceof Obj2){ 
//do something 
} 

Dann können Sie die isIstance Methode verwenden:

String a = "Ciao"; 
if(String.class.isInstance(a)){ //if a is an instance of String - true in this case 
// do something 
} 

wieder den Klassennamen aus dem Objekt bekommen:

String a = "Ciao"; 
if(a.getClass().getName().equals("java.lang.String")){ //in this case true 
//do something 
} 

Natürlich instanceof ist einfacher zu bedienen. Aber immer besser Wege kennen.

Weitere Sie Java Reflection

0

die sauberste Lösung aus einer OO-Design-Perspektive, ein Verfahren zu Ihrer FoodItem Schnittstelle wie

studieren können
List<FoodItem> getContainedFoodItems(); 

Dann Implementierungen von FoodItem hinzufügen würde, die keine alle anderen Nahrungsmittel könnten nur eine leere Liste (zB Collections.empty list()) zurückgeben, während eine FoodItem wie Dessert, die Candies enthält, diese aus ihrer getContainedFoodItems() Methode zurückgeben würde.

Ihre checkIfThere Methode muss dann nicht instanceof Schecks oder Reflexion (von denen beide soll vermieden werden, wenn es eine bessere Alternative zur Verfügung, wie in diesem Fall gibt es) verwenden und immer getContainedFoodItems einfach anrufen. Sie können es sogar vermeiden, die Größe der zurückgegebenen Liste zu überprüfen und sie nur bedingungslos zu iterieren, da der Körper der Schleife sowieso nie ausgeführt wird, wenn die Liste leer ist.