Значение @NotNull для получения и установки параметра

Полагая и используя какую аннотацию @NotNull Java мне следует использовать?, я иметь класс, в котором есть определенные поля, помеченные как @NotNull [package javax.validation.constraints] для передачи клиентам. Класс также реализует геттер и сеттер по умолчанию для таких полей. Пример класса ниже -

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;
    }
}

Я немного озадачен использованием геттера следующим образом в бизнес-логике:

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

Не является ли эта проверка null излишней, (если нет) интересно узнать, ПОЧЕМУ?

Также, если это избыточно, хотелось бы подумать об установке нулевого значения и получении значения параметра. Дал это попробовать как -

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

person Naman    schedule 14.10.2016    source источник


Ответы (1)


@NonNull — это всего лишь подсказка для вашего инструментария, он не влияет на то, как сам язык java обрабатывает нули. Это также требует, чтобы каждое взаимодействие было должным образом аннотировано, чтобы гарантировать обнаружение всех ошибок.

Это происходит в вашем случае, хотя поле name аннотировано, а методы, взаимодействующие с этим полем, - нет, поэтому инструментарий не может делать никаких предположений об этих методах и их обнуляемости.

Однако, если вы введете больше аннотаций, подобных этому:

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, что вы устанавливаете значение, допускающее значение NULL, для свойства, отличного от 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;
}
person Kiskae    schedule 14.10.2016