Usando asserções Java

Usando asserções Java

1. Introdução

A palavra-chave Javaassert permite que os desenvolvedores verifiquem rapidamente certas suposições ou estado de um programa.

Neste artigo,we’ll take a look at how to use the Java assert keyword.

2. História das afirmações Java

A palavra-chave Javaassert foi introduzida no Java 1.4, então já existe há um bom tempo. No entanto, permanece uma palavra-chave pouco conhecida que pode reduzir drasticamente o clichê e tornar nosso código mais legível.

Por exemplo, muitas vezes em nosso código, precisamos verificar determinadas condições que podem impedir que nosso aplicativo funcione corretamente. Normalmente escreveríamos algo assim:

Connection conn = getConnection();
if(conn == null) {
    throw new RuntimeException("Connection is null");
}

Usando asserções, podemos remover a instruçãoifethrow com uma única instruçãoassert.

3. Ativando Asserções Java

Como as asserções Java usam a palavra-chaveassert, não há bibliotecas necessárias ou pacotes para importar.

Observe que antes do Java 1.4 era perfeitamente legal usar a palavra "assert" para nomear variáveis, métodos etc. Isso potencialmente cria um conflito de nomenclatura ao usar um código mais antigo com versões mais recentes da JVM.

Portanto, para compatibilidade com versões anteriores,the JVM disables assertion validation by default. Eles devem ser ativados explicitamente usando o argumento de linha de comando-enableassertions ou sua abreviação-ea:

java -ea com.example.assertion.Assertion

Neste exemplo, habilitamos asserções para todas as classes.

Também podemos habilitar asserções para pacotes e classes específicos:

java -ea:com.example.assertion... com.example.assertion.Assertion

Aqui, habilitamos asserções para todas as classes no pacotecom.example.assertion.

Da mesma forma, eles podem ser desabilitados para pacotes e classes específicos usando o argumento de linha de comando-disableassertions ou sua abreviação-da. Também podemos usar todos esses quatro argumentos juntos.

4. Usando asserções Java

Para adicionar asserções,simply use the assert keyword and give it a boolean condition:

public void setup() {
    Connection conn = getConnection();
    assert conn != null;
}

Java também fornece uma segunda sintaxe para asserções que usam uma string, que será usada para construirAssertionError se uma for lançada:

public void setup() {
    Connection conn = getConnection();
    assert conn != null : "Connection is null";
}

Nos dois casos, o código está verificando se uma conexão com um recurso externo retorna um valor não nulo. Se esse valor fornull,, a JVM seráautomatically throw an AssertionError.

No segundo caso, a exceção terá os detalhes adicionais que aparecerão no rastreamento da pilha e podem ajudar na depuração do problema.

Vamos dar uma olhada no resultado da execução de nossa classe com as asserções habilitadas:

Exception in thread "main" java.lang.AssertionError: Connection is null
        at com.example.assertion.Assertion.setup(Assertion.java:15)
        at com.example.assertion.Assertion.main(Assertion.java:10)

5. Lidando com umAssertionError

A classeAssertionError estendeError, que por sua vez estendeThrowable. Isso significa queAssertionError é uma exceção não verificada.

Portanto, os métodos que usam asserções não são necessários para declará-las e o código de chamada adicional não deve tentar capturá-las.

AssertionErrors are meant to indicate unrecoverable conditions em um aplicativo, portanto, nunca tente manipulá-los ou tentar recuperá-los.

6. Melhores Práticas

A coisa mais importante a lembrar sobre asserções é que elas podem ser desabilitadas, entãonever assume they’ll be executed.

Portanto, lembre-se do seguinte ao usar afirmações:

  • Sempre verifique os valores nulos eOptionals vazio quando apropriado

  • Evite usar asserções para verificar as entradas em um método público e, em vez disso, use uma exceção verificada comoIllegalArgumentException ouNullPointerException

  • Não chame métodos em condições de asserção e, em vez disso, atribua o resultado do método a uma variável local e use essa variável comassert

  • Asserções são ótimas para lugares no código que nunca serão executados, como o casodefault de uma instruçãoswitch ou após um loop que nunca termina

7. Conclusão

A palavra-chave Javaassert está disponível há muitos anos, mas continua sendo um recurso pouco conhecido da linguagem. Ele pode ajudar a remover muitos códigos padrão, tornar o código mais legível e ajudar a identificar erros no início do desenvolvimento do programa.

Lembre-se de que as asserções não são habilitadas por padrão, então nunca presuma que elas serão executadas quando usadas no código.

Como sempre, o código-fonte completo está disponívelover on GitHub.