2017-04-09 3 views
0

Ich mache etwas, das mit JSON in der Verarbeitung beschäftigt. Das Eingabeformat ist flexibel, daher muss ich oft denselben Code für verschiedene Klassen verwenden. Gibt es einen bevorzugten Weg, dies zu tun, was ich getan habe?Ausführen derselben Funktionen für verschiedene Klassen

Object part = json.get(0); 
File saveTo = new File(dataPath("test.txt")); 
if (part.getClass() == JSONObject.class) 
    ((JSONObject)part).save(saveTo, ""); 
if (part.getClass() == JSONArray.class) 
    ((JSONArray)part).save(saveTo, ""); 
+0

Warum brauchen Sie die Besetzung? ['toString'] (https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#toString()) ist eine Methode von' Object' – UnholySheep

+1

Schreiben Sie den Code einmal für eine Vorfahre aller Klassen, die die betreffende Methode haben. – Aziuth

+0

@UnholySheep Nun, das war ein schlechtes Beispiel. Daran habe ich nicht gedacht. – dzaima

Antwort

1

Paar Dinge:

Zunächst einmal sollten Sie immer if Aussagen in { } geschweiften Klammern wickeln.

Object part = json.get(0); 
File saveTo = new File(dataPath("test.txt")); 
if (part.getClass() == JSONObject.class){ 
    ((JSONObject)part).save(saveTo, ""); 
} 
if (part.getClass() == JSONArray.class){ 
    ((JSONArray)part).save(saveTo, ""); 
} 

Zweitens, wenn Sie nur eine dieser if Aussagen erwarten auszuführen, dann sollten Sie vielleicht ein else if verwenden:

Object part = json.get(0); 
File saveTo = new File(dataPath("test.txt")); 
if (part.getClass() == JSONObject.class){ 
    ((JSONObject)part).save(saveTo, ""); 
} 
else if (part.getClass() == JSONArray.class){ 
    ((JSONArray)part).save(saveTo, ""); 
} 

Drittens Sie die instanceof Operator, anstatt sich die Klasse verwenden:

Object part = json.get(0); 
File saveTo = new File(dataPath("test.txt")); 
if (part instanceof JSONObject){ 
    ((JSONObject)part).save(saveTo, ""); 
} 
else if (part instanceof JSONArray){ 
    ((JSONArray)part).save(saveTo, ""); 
} 

Aber um Ihre Frage zu beantworten, ist es nicht eine gute Möglichkeit, diesen Code zu minimieren, weil JSONObject und JSONArray sind beide direkte Unterklassen von Object. Es wäre einfacher, wenn beispielsweise JSONArray eine Unterklasse von JSONObject wäre, aber das ist es nicht.

Aber wenn Sie sich selbst zu schreiben diesen Code an mehreren Stellen finden, sollten Sie es in eine Funktion, wie diese extrahieren:

void saveJsonThing(Object part, File file) 
    if (part instanceof JSONObject){ 
     ((JSONObject)part).save(saveTo, ""); 
    } 
    else if (part instanceof JSONArray){ 
     ((JSONArray)part).save(saveTo, ""); 
    } 
    else{ 
     //handle error? 
    } 
} 

Dann Code, kann nur diese Funktion aufrufen, wenn es etwas retten muss:

Object part = json.get(0); 
File saveTo = new File(dataPath("test.txt")); 
saveJsonThing(part, saveTo); 
Verwandte Themen