为不同的类执行相同的功能
问题描述:
我正在做一些处理JSON的事情。输入格式很灵活,所以我需要经常为不同的类执行相同的代码。有没有其他的方法可以做到这一点,我做了什么?为不同的类执行相同的功能
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, "");
答
两件事情:
首先,你应该总是包装在{ }
花括号if
语句。
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, "");
}
其次,如果你只希望那些if
要执行的语句之一,那么你或许应该使用else if
:
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, "");
}
第三,你可以使用,而不是让班里的instanceof
操作:
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, "");
}
但回答你的问题,有没有一种很好的方法来最小化此代码,因为JSONObject
和JSONArray
都是Object
的直接子类。如果JSONArray
是JSONObject
的一个子类,它会更容易,但事实并非如此。
但如果你发现自己写在多个地方的代码,你应该将其解压缩到一个函数,就像这样:
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?
}
}
那么你的代码只需调用时,它需要保存一些功能:
Object part = json.get(0);
File saveTo = new File(dataPath("test.txt"));
saveJsonThing(part, saveTo);
为什么你需要演员? ['toString'](https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#toString())是'Object'的一种方法。 – UnholySheep
为代码写一次代码具有所述方法的所有类的祖先。 – Aziuth
@UnholySheep那么猜这是一个坏榜样。没有想到这一点。 – dzaima