为不同的类执行相同的功能

时间:2017-04-09 10:53:45

标签: java processing

我正在制作处理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, "");

1 个答案:

答案 0 :(得分:1)

夫妻俩:

首先,您应该始终在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, "");
}

但要回答您的问题,最好尽量减少此代码,因为JSONObjectJSONArray都是Object的直接子类。如果JSONArrayJSONObject的子类,那就更容易了,但事实并非如此。

但如果您发现自己在多个地方编写此代码,则应将其提取到函数中,如下所示:

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);