2016-11-12 5 views
4

下の私の例では、getViewを使用するたびにgetView!= nullを書くことを避けたいと思います。それをきれいに保つために私は、私のためのチェックを行うメソッドhasView()を作成します。しかし、私はまだ警告を得る。これを回避する方法はありますか?回避する!= java内のメソッドを使用してnull

import android.support.annotation.Nullable; 

public void showView(){ 
    if(hasView()){ 
     getView().show(); // Shows warning Method invocation 'showLoading' may produce 'java.lang.NullPointerException' 
    } 
} 


boolean hasView(){ 
    return getView() != null; 
} 

@Nullable 
private View getView(){ 
    return view; 
} 

私はAndroidスタジオ/ IntelliJを使用しています。私は@ SuppressWarnings I have seen this questionを使うことができることを知っていますが、これはコードを醜いものにします。

+5

ご迷惑をおかけしています。 – GhostCat

+0

showLoading()はどこですか? – developer

+0

ビューがnullのときにアプリは何をしますか?ビューを取得/取得できない場合は、アプリケーションを停止して問題を報告すると思います。 –

答えて

7

を私はgetViewメソッドを書き込まないようにしたい=私は getViewメソッドを使用したいヌルたびに! ?

あなたがプログラム内のどこにでも!= nullのチェックを回避するために、nullオブジェクトパターンを使用することができ、コードを以下に示します。

(1)EmptyViewクラス

public EmptyView { 

    //Define a static emptyView, so that we can reuse the same object 
    public static final EmptyView emptyView = new EmptyView(); 

    public show() { 
     //does nothing 
     } 
    } 

を定義します(2)表示がない場合はEmptyViewを使用してください:

//other classes: 
    private View getView(){ 
     if(viewAvailable) { 
      return view; 
     } else { 
      return EmptyView.emptyView; 
     } 
    } 

    public void showView(){ 
     getView().show(); 
    } 

あなたはWiki hereより詳しい情報& Javaの例を見ることができます。

さまざまな方法からnullを返すと、プログラム内でNullPointerExceptionが発生する可能性があり、大きなプロジェクトではデバッグが非常に困難になります。

だから、方法(&彼らは避けるべきである)からnullを返すために悪い習慣であり、それはDAOからデータを取得しようとしたときに春のAPIは、一般的に/(代わりにnullの)list/set空のオブジェクトを返す理由ですRepositoryクラス(上記のようなEmptyViewオブジェクトのような)。

P.S .:このオプションは、Java8の有無に関係なく動作します。 Java8を使用している場合は、@ yanosの回答にあるようにOptionalとすることをお薦めします。

+0

ありがとう。私はJava8を使用していないので、このパターンを使用する必要があります。唯一厄介なことは、ビューにメソッドを追加するたびにEmptyViewにも更新する必要があることです。 –

+0

追加する必要があるようなサンプルメソッドを教えてもらえますか? – developer

+1

良い提案。 EmptyViewの静的インスタンスを定義する場合、 "new EmptyView()"を実行しないでください。それは「空」なので、定義上不変であり、再利用に副作用はありません。 – Insac

4

あなたはOptionalを使用してに興味があるかもしれませんが、例えば、APIレベルでのAndroidの24を追加しました:

private Optional<View> getView() { 
    return Optional.ofNullable(view); 
} 

public void showView() { 
    getView().ifPresent(View::show); 
} 
+2

オプションは、私が念頭に置いていた最初のものであり、あなたの答えによって、Androidで利用可能であることを学んだ:) –

+0

ありがとう、これは素晴らしいですが、残念ながら私は現在のプロジェクトにJava8を使用していません。しかし、私は間違いなくこれを将来使用する予定です。 :) –

関連する問題