Anotações de segurança nula na primavera

Anotações de segurança nula na primavera

1. Visão geral

A partir do Spring 5, agora temos acesso a um recurso interessante que nos ajuda a escrever um código mais seguro. Esse recurso é chamado de segurança nula, um grupo de anotações que funciona como uma salvaguarda que cuida de possíveis referências nulas.

Em vez de nos permitir escapar impunes de código inseguro,the null-safety feature produces warnings at compile time. Tais avisos podem evitar exceções de ponteiro nulo catastróficas (NPEs) em tempo de execução.

2. A anotação@NonNull

A anotação@NonNull é a mais importante entre todas as anotações do recurso de segurança nula. We can use this annotation t0 declare non-null constraint anywhere an object reference is expected: um campo, um parâmetro de método ou valor de retorno de um método.

Suponha que tenhamos uma classe chamadaPerson:

public class Person {
    private String fullName;

    void setFullName(String fullName) {
        if (fullName != null && fullName.isEmpty()) {
            fullName = null;
        }
        this.fullName = fullName;
    }

    // getter
}

Esta definição de classe é válida, mas tem um defeito - o campofullName pode ser definido comonull. Se isso acontecer, podemos acabar com um NPE ao trabalhar comfullName.

O recurso de segurança nula do Spring permite que as ferramentas relatem esse perigo. Por exemplo, se escrevermos código no IntelliJ IDEA e decorarmos o campofullName com a anotação@NonNull, veremos um aviso:

image

Graças a essa indicação, estamos cientes do problema com antecedência e podemos tomar as medidas adequadas para evitar uma falha no tempo de execução.

3. A anotação@NonNullFields

A anotação@NonNull é útil para garantir segurança nula. No entanto, poluiríamos toda a base de código se adornássemos todos os campos não nulos com esta anotação.

Podemos evitar o abuso de@NonNull com outra anotação -@NonNullFields. This annotation is applicable at the package level, notifying our development tools that all fields in the annotated package are, by default, non-null.

Para que a anotação@NonNullFields seja iniciada, precisamos criar um arquivo chamadopackage-info.java no diretório raiz do pacote e anotar o pacote com@NonNullFields:

@NonNullFields
package org.example.nullibility;

Vamos declarar outra propriedade na classePerson, chamadanickName:

package org.example.nullibility;

// import statements

public class Person {
    private String nickName;

    void setNickName(@Nullable String nickName) {
        if (nickName != null && nickName.isEmpty()) {
            nickName = null;
        }
        this.nickName = nickName;
    }

    // other declarations
}

Desta vez, não embelezamos o camponickName com@NonNull, mas ainda vemos uma advertência semelhante:

image

A anotação@NonNullFields torna nosso código menos prolixo enquanto garante o mesmo nível de segurança que@NonNull fornece.

4. A anotação@Nullable

A anotação@NonNullFields geralmente é preferível a@NonNull, pois ajuda a reduzir o clichê. Às vezes, queremos isentar alguns campos da restrição não nula especificada no nível do pacote.

Vamos voltar ao camponickName em e decorá-lo com a anotação@Nullable:

@Nullable
private String nickName;

O aviso que vimos antes se foi agora:

image

Nesta situação,we used the @Nullable annotation to override the semantics of @NonNullFields on a field.

5. A anotação@NonNullApi

A anotação@NonNullFields só se aplica, como seu nome sugere, aos campos. If we want to have the same impact on the methods' parameters and return values, we’ll need @NonNullApi.

Tal como acontece com@NonNullFields, devemos especificar a anotação@NonNullApi no arquivopackage-info.java:

@NonNullApi
package org.example.nullibility;

Vamos definir um getter para o camponickName:

package org.example.nullibility;

// import statements

public class Person {
    @Nullable
    private String nickName;

    String getNickName() {
        return nickName;
    }

    // other declarations
}

Com a anotação@NonNullApi em vigor, um aviso é emitido sobre um possível valornull produzido pelo métodogetNickName:

image

Observe que, assim como a anotação@NonNullFields, podemos substituir o@NonNullApi no nível do método pela anotação@Nullable.

6. Conclusão

A segurança nula da primavera é um ótimo recurso que ajuda a diminuir a possibilidade de NPEs. No entanto, há dois pontos importantes que precisamos tomar cuidado ao usar esse recurso:

  • Só pode ser usado em uma ferramenta de desenvolvimento de suporte, como o IntelliJ IDEA

  • Ele não impõe verificações denull em tempo de execução - ainda precisamos escrever código para evitar NPEs

O código-fonte deste tutorial pode ser encontradoover on GitHub.