2017-02-07 7 views
0

は、私はその簡略化は次のように見えます、複雑な検証システムのビットを持って、次の@NotNullを使用し、メソッド呼び出しの前に別​​のメソッドでnullをチェックする場合、null警告を回避する方法はありますか?

private static void mainMethod(@Nullable String startParam, @Nullable String nextParam) { 

    String nextStep = methodSelect(startParam, nextParam); 

    switch (nextStep) { 
     case "none": 
      break; 
     case "goFinal": 
      finalMethod(startParam); 
      break; 
     case "goNext": 
      nextMethod(nextParam); 
      break; 
    } 
} 

private static void nextMethod(@NotNull String nextParam) { 
    System.out.println(nextParam); 
} 

private static void finalMethod(@NotNull String startParam) { 
    System.out.println(startParam); 
} 

@NotNull 
private static String methodSelect(@Nullable String startParam,@Nullable String nextParam) { 
    if (startParam == null && nextParam == null) { 
     return "none"; 
    } if (startParam == null) { 
     return "goNext"; 
    } else { 
     return "goFinal"; 
    } 
} 

しかし、私は警告を取得するときfinalMethod()とにNextMethod()引数xのかもしれない」についての両方を呼び出すswitch文でmethodSelect()とその後のswitch文は、これらの引数がnullでないことを確認します。 これらの警告を取り除くにはどうしたらいいですか?ありがとう!

私はのIntelliJ IDEA 2016年3月4日、ジャワ8、および注釈を使用しています:

import org.jetbrains.annotations.NotNull; 
import org.jetbrains.annotations.Nullable; 

答えて

0

これは、非常にトリッキーなコード - あなたは、実行時に応じて、異なる方法への呼び出しを行うためにリフレクションを模倣していますテスト。

IntelliJ IDEAでは、IDEまたはcode annotationで警告を抑制します。

その他のツールには、より洗練されたコード解析があります。 ここでは、呼び出すメソッドを示す文字列の代わりにブール値を使用するコードのわずかな変形があります。 Checker FrameworkのNullness Checkerは、事後条件の注釈@EnsuresNonNullIfのおかげで、このコードのnullness-safetyを確認することができます。

import org.checkerframework.checker.nullness.qual.*; 

class Example { 

    private static void mainMethod(@Nullable String startParam, @Nullable String nextParam) { 

    if (! useFinal(startParam)) { 
     // do nothing 
    } else { 
     finalMethod(startParam); 
    } 
    } 

    private static void nextMethod(@NonNull String nextParam) { 
    System.out.println(nextParam); 
    } 

    private static void finalMethod(@NonNull String startParam) { 
    System.out.println(startParam); 
    } 

    @EnsuresNonNullIf(expression="#1", result=true) 
    private static boolean useFinal(@Nullable String startParam) { 
    if (startParam == null) { 
     return false; 
    } else { 
     return true; 
    } 
    } 

} 

現在、あなたの元のコードで使用される文字列を処理しない@EnsuresNonNullIf注釈。そのような拡張子を保守者に要求するか、自分で実装してプルリクエストを送信することができます。

+0

偉大な答えをありがとう! –

関連する問題