2017-12-11 10 views
1

アダプタでデータをバインドするときは、Modelを使用してこれを行います。モデルを判断する良い方法はnullですか?

class ModelA{ 
    ModelB b; 
    ...... 
    geters and setters 
} 

class ModelB{ 
    ModelC c; 
    ...... 
    geters and setters 
} 

class ModelC{ 
    String name; 
    ...... 
    geters and setters 
} 

私は名前を使用したいとき、私はこれを行う必要があります。

bindData(ModelA a) { 
    String name = a.getModelB().getModelC().getName(); 
    mTextView.setText(name); 
} 

が、モデルがnullの場合もあるので、私はこの追加:私は使用をしようと考えるしかし

bindData(ModelA a) { 
    if(a != null && a.getModelB() != null 
     && a.getModelC() != null 
     &&!TextUtils.isempty(a.getModelB().getModelC().getName())) { 
    String name = a.getModelB().getModelC().getName(); 
    mTextView.setText(name); 
    } 
} 

をキャッチが楽になる可能性があるので、私はこれを変更しました:

bindData(ModelA a) { 
    try{ 
     String name = a.getModelB().getModelC().getName(); 
     mTextView.setText(name); 
    }catch (NullPointerException e) { 
     ...... 
    } 
} 

モデルがnullであると判断する良い方法はありますか?もしそうでなければ、 "もし"と "試してください"が良いですか?

+0

私はあなたのユースケースを扱う良い方法はないと思います。可能な代替として、あなたのコードでそのような入れ子クラス構造を維持しないことをお勧めしますか?本当に深さ3の階層が必要ですか? –

+0

@TimBiegeleisenはい、これはサンプルに過ぎませんが、3つ以上の奥行きを使用していても、それを変更することはできません。 –

答えて

1

私の場合、モデルが事前にヌルであるかどうかを確認し、getter()から変数をチェックしません。 nullの場合、ビューをレンダリングする必要はありません。 (私がNULLをチェックするのが好きではないので、JavaをKotlinに移したい理由の1つです)

+0

データがnullの場合、デフォルトのデータをバインドする必要があります。このようにして、ifブロックごとにデフォルトデータをバインドするメソッドの時刻を呼び出す必要があります –

+0

@ngU私の場合、initViews )とrenderViews()です。 renderViewsはリモートデータを処理するためのものです。 Android開発者にとっては共通の問題だと思う。有名なサンプルのオープンソースプロジェクトを確認できると思います。 – kimkevin

+0

'mTextView.text = a.modelB?.modelC?.name?:return;'を使用したいと思います。 – ice1000

関連する問題