2017-05-14 7 views
-2

私はJobModelというJavaクラスを持っていますが、IModelインタフェースを実装しています。このモデルには1つのアイテムが含まれます。以下を行う方法

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

私はGeneric TypeをとるBaseControllerというコントローラを持っています。このコントローラはIOnAsyncResultとIControllerを実装します。どちらも私がセットアップしたカスタムインターフェイスです。

私がしようとしているのは、以下の実装があるAPIを呼び出すためのプロセスにフックできるフレームワークを実装することです。

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オブジェクトがで処理されます。ここでは

がある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機能で処理されたAPIから呼び出される関数であり、 ProcessJsonObjectは次のとおりです。

public IModel<T> ProcessJsonObject(JSONObject o) { 
    return model.Instantiate(o); 
} 

モデルフィールドはクラスですフィールドは、コントローラのコンストラクタでインスタンス化されます。コントローラは、ベースコントローラクラスを拡張します。

これはすべてのモデルで、リスト、を除いて、正常に動作し、かつ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. 
} 

はどのようにして、現在のセットアップのためのゲッター/セッターの機能にアクセスするか、このような疎結合なフレームワークを達成するために適切な設定で何ですか?

答えて

0

この投稿はディスカッションには至りませんでしたので、私は状況を回避するために私が行ったことを投稿しました。

主な問題は、モデルクラスのゲッターとセッターにアクセスすることでした。そこで、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); 
} 

希望を考慮すべき唯一のことは、あなたのような、ジェネリック型への呼び出し関数に返す値をキャストしなければならないということです。

関連する問題