2016-10-14 10 views
1

Which @NotNull Java annotation should I use?을 믿고 사용하는 특정 필드가 @NotNull [package javax.validation.constraints]으로 표시된 클래스가 클라이언트에 전달됩니다. 또한 클래스는 이러한 필드에 대한 기본 getter 및 setter를 구현합니다. 아래 샘플 클래스 -Getter 및 Setter 매개 변수의 @NotNull 의미

if(new MyClass().getName() !=null) { 
    //do something 
} 

중복이 null 확인되지 않으며, - 비즈니스 로직에 다음과 같이 내가 조금 남아 있어요

public class MyClass 
{ 
    public MyClass() { 
    } 

    @NotNull 
    private String name; 

    private Boolean bool; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public Boolean isBool() { 
     return bool; 
    } 

    public void setBool(Boolean bool) { 
     this.bool = bool; 
    } 
} 

는 게터의 사용과 함께 당혹 (그렇지 않은 경우) 호기심을 알고 WHY?

또한 중복되는 경우 null 값을 설정하고 param의 값을 가져 오는 것을 고려하고 싶습니다. 이 같은 시도했다 -

void test() { 
    myClass.setName(null); 
    if (myClass.getName() == null) { 
     System.out.println("It should not be null"); // this got printed 
    } 
} 

답변

4

@NonNull 것은 당신의 공구 만 힌트, 그것은 자바 언어 자체가 널 (null)을 처리하는 방법에 영향을주지 않습니다. 또한 모든 실수가 발견되도록 모든 상호 작용에 적절하게 주석을 달아야합니다.

name 필드에 주석이 달린 반면 해당 필드와 상호 작용하는 메소드는 그렇지 않으므로 툴링은 해당 메소드와 해당 null 허용 여부에 대한 가정을 할 수 없습니다.

그러나이 같은 더 많은 주석을 도입하는 경우 :

public void setName(@Nullable String name) { 
    this.name = name; // should now have a warning 
} 

@NonNull 
public String getName() { 
    return name; 
} 

지금 툴링은 항상 new MyClass().getName() != null 진정한 표시해야합니다. 또한 setName에서 Nullable 값을 null이 아닌 속성으로 설정하고 있는데 이는 잘못된 것이라고 경고합니다. 고정

방법 :

public void setName(@NonNull String name) { 
    // setName(null) would cause a warning 
    // Also add an exception if the annotation is ignored. 
    this.name = Objects.requireNonNull(name); 
} 

/* or */ 

public void setName(@Nullable String name) { 
    if (name == null) return; // Guard against setting null 
    this.name = name; 
}