![](/img/trans.png)
[英]How to avoid redundant method calls when checking the result first for null?
[英]How to avoid null warning when using @NotNull and checking for null in another method before method call?
我有一個復雜的驗證系統,簡化后的外觀類似於以下內容:
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";
}
}
但是當在switch語句中調用finalMethod()和nextMethod()關於“參數x可能為空”時,即使在methodSelect()和switch語句隨后確保這些參數不會為空的情況下,我也得到警告。 我如何正確擺脫這些警告,希望在這些方法中或之前無需再次檢查null? 謝謝!
我正在使用IntelliJ IDEA 2016.3.4,Java 8和注釋:
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
這是非常棘手的代碼-您正在模仿反射,以根據運行時測試調用不同的方法。
在IntelliJ IDEA中,您將希望在IDE中或通過代碼注釋抑制警告。
其他一些工具具有更復雜的代碼分析。 這是代碼的一個略微變體,它使用布爾值而不是字符串來指示要調用的方法。 由於后置條件注釋@EnsuresNonNullIf
,Checker框架的Nullness Checker能夠驗證此代碼的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
批注當前不處理原始代碼中使用的字符串。 您可以向維護者請求此類擴展,也可以自己實施,然后提交請求請求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.