我有一个名为JobModel的java类,它实现了IModel接口。该模型包含一个项目。
public interface IModel<T> { T Instantiate(JSONObject o); }
引用的函数在JobModel类中看起来像这样。
public IModel<JobModel> Instantiate(JSONObject o) {
JobModel j = new JobModel();
try {
j.setID(o.getInt("ID"));
j.setName(o.getString("Name"));
j.setDescription(o.getString("Description"));
}
catch (Exception e) { e.printStackTrace(); }
return j;
}
我有一个名为BaseController的控制器,它采用Generic Type。该控制器实现IOnAsyncResult和IController。这两个都是我设置的自定义界面。
我想要做的是实现一个框架,允许我挂钩到调用API的过程,我有以下实现。
这是从API AsyncTask类
调用的函数public void onResultSuccess(int resultCode, JSONArray results) {
ProcessJsonArray(results);
try { if (this.viewDelegate != null) this.viewDelegate.InterfaceUpdate(list); }
catch (Exception e) { e.printStackTrace(); }
}
JSON数组在ProcessJsonArray函数中处理,即:
public void ProcessJsonArray(JSONArray a) {
for (int i=0; i < a.length(); i++) {
try { list.add(this.ProcessJsonObject(a.getJSONObject(i))); }
catch (Exception e) { e.printStackTrace(); }
}
}
在ProcessJsonObject中处理各个JSON对象,即:
public IModel<T> ProcessJsonObject(JSONObject o) {
return model.Instantiate(o);
}
模型字段是一个类字段,它在Controller的构造函数中实例化,特指扩展基本控制器类的控制器。
这一切都很好,除了模型,列表和resultsList以这种方式设置:
public ArrayList<IModel<T>> list;
public ArrayList<IModel<T>> resultsList;
public IModel<T> model;
当我尝试使用任何属性时,我发现了挑战。例如,当我尝试使用作业控制器设置时迭代列表属性时,我无法访问作业模型的Getter和Setter函数。迭代设置如下:
for (IModel<JobModel> j : list) {
if (j.getName().contains(Value)) { addToResultsList(j); }
//Additional else/if statements removed for bravity.
}
如何访问当前设置的Getter / Setter函数,或者完成像这样的松耦合框架的正确设置是什么?
答案 0 :(得分:0)
由于这篇文章没有引发任何讨论,我想我会发布我所做的工作来解决这个问题。
主要问题是访问模型类的Getters和Setter。因此,我从定义的属性(单个对象和列表对象)移动了IModel。
还从每个模型中删除了IModel实现,这允许我将Instantiation函数声明为static。
然后我在我的基本控制器类中实现了这个私有函数。
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// PERMISSION WAS GRANTED
} else {
// USER DID NOT GRANT PERMISSION
}
break;
}
}
这样,允许我调用特定模型类型的Instantiate函数。唯一要考虑的是你必须将调用函数中的返回值强制转换为泛型类型,如下所示:
private Object ReturnPopulatedModelObject(JSONObject o)
{
if (model instanceof PersonModel) { return PersonModel.Instantiate(o); }
else if (model instanceof ContactModel) { return ContactModel.Instantiate(o); }
else if (model instanceof ContactTypeModel) { return ContactTypeModel.Instantiate(o); }
else if (model instanceof JobModel) { return JobModel.Instantiate(o); }
else { throw new IllegalStateException("The Model is defined as something other than predefined! The Model is defined as " + model.getClass().getName() + "."); }
}
希望这有助于一个可能偶然发现这一点的人。