2017-05-14 54 views
-2

我有一個名爲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的控制器,它採用通用類型。該控制器實現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(); } 
    } 
} 

各個JSON對象在處理ProcessJsonObject,它是:

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; 

我找到了挑戰,當我嘗試與任何性質的工作。例如,當我使用Job Controller設置迭代列表屬性時,我無法訪問作業模型的Getter和Setter函數。迭代的設置如下:

for (IModel<JobModel> j : list) { 
    if (j.getName().contains(Value)) { addToResultsList(j); } 
    //Additional else/if statements removed for bravity. 
} 

你如何訪問的getter/setter功能的當前設置,或什麼是適當的設置來完成這樣一個鬆耦合的架構?

回答

0

由於這篇文章沒有引發任何討論,我想我會張貼我所做的工作來解決這個問題。

主要問題是訪問模型類的Getters和Setters。所以,我從定義的屬性(單個對象和列表對象)中移動了IModel。

也從每個模型中刪除了IModel實現,這允許我聲明實例化函數爲靜態。

然後我在我的基本控制器類中實現了這個私有函數。

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() + "."); } 
} 

這樣,我可以調用特定模型類型的實例化函數。唯一要考慮的事情是,你必須在調用函數把返回值的泛型類型,因爲這樣的:

public T ProcessJsonObject(JSONObject o) { 
    return (T)ReturnPopulatedModelObject(o); 
} 

希望這有助於爲在這個誰可能絆倒人。