2017-02-07 12 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의 힘 "에 대해 모두를 호출 스위치 문에서 methodSelect() 및 이후의 switch 문이 이러한 인수가 null이 아니더라도 "null"이 될 수 있습니다. 어떻게 이러한 경고를 제거 할 수 있습니까?이 방법으로 또는 이전에 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 덕분에이 코드의 무효 안정성을 확인할 수 있습니다.

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 주석; 당신은 관리자들로부터 그러한 확장을 요청하거나 직접 구현할 수 있고 pull 요청을 제출할 수 있습니다.

+0

대단히 감사합니다! –