2012-12-28 5 views
228

@Nullable 주석 사용 :내가 선언 자바 몇 가지 방법을 보았다

void foo(@Nullable Object obj) 
{ ... } 

여기 @Nullable의 의미는 무엇입니까? 입력이 null 일 수 있음을 의미합니까? 주석이 없으면 입력은 여전히 ​​null이 될 수 있습니다.

감사

+2

아래의 답에서, 주석은 null 값이 허용된다는 것을 알았습니다. 사용 된 곳의 예, 시도 할 수있는 코드 분석기 및 해석이 다를 수 있음을 알게되었습니다. 왜이 형식이 좋은지보십시오. + 1s, 특히이 질문을하는 경우. – icedwater

+2

어떤 문맥에서'@ Nullable'을 제공하고있는 라이브러리가 있습니까? 그것 [Checker?] (https://checkerframework.org/manual/#nullness-checker) – 8bitjunkie

답변

252

그것은 방법이 null 값을 허용 명확 것을, 그리고 당신이 메소드를 오버라이드 (override)하는 경우, 당신도 null 값을 허용해야한다.

FindBugs과 같은 코드 분석기의 힌트 역할을합니다. 예를 들어, 그러한 메소드가 null을 먼저 확인하지 않고 인수를 역 참조하면 FindBugs가 경고를 내 보냅니다.

+9

http://findbugs.sourceforge.net/ – MrSmith42

64

이 주석은 보통 NullPointerExceptions을 제거하는 데 사용됩니다. @Nullable은 종종이 매개 변수가 null 일 수 있다고 말합니다. 그러한 행동의 좋은 예가 Google Guice에서 찾을 수 있습니다. 이 경량 의존성 삽입 프레임 워크에서이 종속성은 null 일 수 있다고 알립니다. null을 전달하려고하고 주석이 없으면 프레임 워크는 그 일을 거부합니다.

@Nullable@NotNull 주석과 함께 사용할 수 있습니다. 여기에 find 몇 가지 도움말을 사용하여 올바르게 사용할 수 있습니다. IntelliJ의 코드 검사는 주석을 검사하고 코드를 디버그하는 데 도움이됩니다.

6

@Nullable 클레임으로 주석 된 요소는 (메소드의 경우) 리턴하고 (매개 변수의 경우) 전달하고 (로컬 변수 및 필드의 경우) 완벽하게 유효합니다.

@NotNull 클레임으로 주석 된 요소는 메소드에 대해 반환하고 (매개 변수로) 전달하고 (로컬 변수 및 필드에 대해) 유지하는 것이 금지됩니다. 주석 또는 매개 변수 선언 방법들을 구현/재정 때

@Nullable@NotNull 간의 공분산-contravariance 관계가있다. 주석 선언 방법을 구현

재정은/:

  • 부모 방법의 @NotNull 주석 자식 클래스 메소드에 대한
    @NotNull 주석을 필요로한다. 부모 방법에 @Nullable 주석과
  • 방법은 자식 클래스 방법 중 하나 @Nullable 또는 @NotNull 주석을 가질 수 있습니다.주석 매개 변수와 메소드를 구현

재정은/:

  • 부모 방법 에서 매개 변수의 @Nullable 주석 자식 클래스 메소드 매개 변수에 대한 @Nullable 주석을 필요로한다. 부모 방법 매개 변수의 @NotNull 주석과
  • 방법 @Nullable 또는 @NotNull 주석 (또는 없음 중 ) 자식 클래스 메서드의 매개 변수 중 하나를 가질 수 있습니다.

예 :

여기
@Nullable 
public static UserContext getThreadUserContext() { 
    TransactionParms tp = TransactionParms.getBoundParms(); 
    return (tp == null) ? null : tp.getUserContext(); 
} 

getThreadUserContext 방법 TransactionParms의 인스턴스를 반환한다. 그 인스턴스는 다음과 같을 수 있습니다. Null

관련 문제