Asserções Java
Declarações Java
Neste tutorial, aprenderemos sobre a declaração Java assert (asserções Java) com a ajuda de exemplos.
Asserções em Java ajudam a detectar bugs testando o código que supomos ser verdadeiro.
Uma asserção é feita usando o
assert
palavra-chave. Sua sintaxe é:
assert condition;
Aqui,
condition
é uma expressão booleana que assumimos ser verdadeira quando o programa é executado. Ativando declarações
Por padrão, as asserções são desabilitadas e ignoradas em tempo de execução.
Para habilitar asserções, usamos:
java -ea:arguments
OU
java -enableassertions:arguments
Quando as asserções estão habilitadas e a condição é
true
, o programa é executado normalmente. Mas se a condição for avaliada como
false
enquanto as asserções estão habilitadas, a JVM lança um AssertionError
, e o programa pára imediatamente. Exemplo 1:declaração Java
class Main {
public static void main(String args[]) {
String[] weekends = {"Friday", "Saturday", "Sunday"};
assert weekends.length == 2;
System.out.println("There are " + weekends.length + " weekends in a week");
}
}
Saída
There are 3 weekends in a week
Obtemos a saída acima porque este programa não possui erros de compilação e, por padrão, as asserções estão desabilitadas.
Após habilitar as assertivas, obtemos a seguinte saída:
Exception in thread "main" java.lang.AssertionError
Outra forma de declaração de afirmação
assert condition : expression;
Nesta forma de declaração de asserção, uma expressão é passada para o construtor do
AssertionError
objeto. Esta expressão tem um valor que é exibido como a mensagem de detalhes do erro se a condição for false
. A mensagem detalhada é usada para capturar e transmitir as informações da falha de asserção para ajudar na depuração do problema.
Exemplo 2:asserção Java com exemplo de expressão
class Main {
public static void main(String args[]) {
String[] weekends = {"Friday", "Saturday", "Sunday"};
assert weekends.length==2 : "There are only 2 weekends in a week";
System.out.println("There are " + weekends.length + " weekends in a week");
}
}
Saída
Exception in thread "main" java.lang.AssertionError: There are only 2 weekends in a week
Como vemos no exemplo acima, a expressão é passada para o construtor do
AssertionError
objeto. Se nossa suposição for false
e as asserções são habilitadas, uma exceção é lançada com uma mensagem apropriada. Essa mensagem ajuda a diagnosticar e corrigir o erro que causou a falha da asserção.
Habilitando asserção para classes e pacotes específicos
Se não fornecermos nenhum argumento para as opções de linha de comando de asserção,
java -ea
Isso habilita asserções em todas as classes, exceto classes de sistema.
Também podemos habilitar a asserção para classes e pacotes específicos usando argumentos. Os argumentos que podem ser fornecidos a essas opções de linha de comando são:
Ativar declaração em nomes de classe
Para habilitar a asserção para todas as classes do nosso programa Main,
java -ea Main
Para habilitar apenas uma classe,
java -ea:AnimalClass Main
Isso permite a afirmação apenas no
AnimalClass
no Main
programa. Ativar declaração em nomes de pacotes
Para habilitar asserções para o pacote
com.animal
e seus subpacotes apenas,
java -ea:com.animal... Main
Ativar declaração em pacotes sem nome
Para habilitar a asserção em pacotes sem nome (quando não usamos uma instrução de pacote) no diretório de trabalho atual.
java -ea:... Main
Ativar asserção nas classes do sistema
Para habilitar a asserção nas classes do sistema, usamos uma opção de linha de comando diferente:
java -esa:arguments
OU
java -enablesystemassertions:arguments
Os argumentos que podem ser fornecidos a essas opções são os mesmos.
Desativando declarações
Para desabilitar asserções, usamos:
java -da arguments
OU
java -disableassertions arguments
Para desabilitar a asserção nas classes do sistema, usamos:
java -dsa:arguments
OU
java -disablesystemassertions:arguments
Os argumentos que podem ser passados ao desabilitar asserções são os mesmos ao habilitá-los.
Vantagens da afirmação
- Rápido e eficiente para detectar e corrigir bugs.
- As verificações de asserção são feitas apenas durante o desenvolvimento e o teste. Eles são removidos automaticamente no código de produção em tempo de execução para que não atrase a execução do programa.
- Ajuda a remover o código clichê e torná-lo mais legível.
- Refatora e otimiza o código com maior confiança de que ele funciona corretamente.
Quando usar asserções
1. Códigos inacessíveis
Códigos inacessíveis são códigos que não são executados quando tentamos executar o programa. Use asserções para garantir que os códigos inacessíveis sejam realmente inalcançáveis.
Vamos dar um exemplo.
void unreachableCodeMethod() {
System.out.println("Reachable code");
return;
// Unreachable code
System.out.println("Unreachable code");
assert false;
}
Vamos dar outro exemplo de uma instrução switch sem um caso padrão.
switch (dayOfWeek) {
case "Sunday":
System.out.println("It’s Sunday!");
break;
case "Monday":
System.out.println("It’s Monday!");
break;
case "Tuesday":
System.out.println("It’s Tuesday!");
break;
case "Wednesday":
System.out.println("It’s Wednesday!");
break;
case "Thursday":
System.out.println("It’s Thursday!");
break;
case "Friday":
System.out.println("It’s Friday!");
break;
case "Saturday":
System.out.println("It’s Saturday!");
break;
}
A instrução switch acima indica que os dias da semana podem ser apenas um dos 7 valores acima. Não ter caso padrão significa que o programador acredita que um desses casos sempre será executado.
No entanto, pode haver alguns casos que ainda não foram considerados em que a suposição é realmente falsa.
Essa suposição deve ser verificada usando uma asserção para garantir que o caso de comutação padrão não seja alcançado.
default:
assert false: dayofWeek + " is invalid day";
Se diaDaSemana tem um valor diferente dos dias válidos, um
AssertionError
é lançado. 2. Documentando suposições
Para documentar suas suposições subjacentes, muitos programadores usam comentários. Vamos dar um exemplo.
if (i % 2 == 0) {
...
} else { // We know (i % 2 == 1)
...
}
Use afirmações em vez disso.
Os comentários podem ficar desatualizados e fora de sincronia à medida que o programa cresce. No entanto, seremos forçados a atualizar o
assert
declarações; caso contrário, eles também podem falhar para condições válidas.
if (i % 2 == 0) {
...
} else {
assert i % 2 == 1 : i;
...
}
Quando não usar asserções
1. Verificação de argumentos em métodos públicos
Argumentos em métodos públicos podem ser fornecidos pelo usuário.
Portanto, se uma asserção for usada para verificar esses argumentos, as condições podem falhar e resultar em
AssertionError
. Em vez de usar asserções, deixe que resulte nas exceções de tempo de execução apropriadas e trate essas exceções.
2. Para avaliar expressões que afetam a operação do programa
Não chame métodos ou avalie exceções que possam afetar posteriormente a operação do programa em condições de asserção.
Vamos dar um exemplo de uma lista dias da semana que contém os nomes de todos os dias de uma semana.
ArrayList<String> weekdays = new ArrayList<>(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ));
ArrayList<String> weekends= new ArrayList<>(Arrays.asList("Sunday", "Saturday" ));
assert weekdays.removeAll(weekends);
Aqui, estamos tentando remover elementos
Saturday
e Sunday
da ArrayList dias da semana . Se a asserção estiver habilitada, o programa funciona bem. No entanto, se as asserções estiverem desabilitadas, os elementos da lista não serão removidos. Isso pode resultar em falha do programa.
Em vez disso, atribua o resultado a uma variável e, em seguida, use essa variável para asserção.
ArrayList<String> weekdays = new ArrayList<>(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ));
ArrayList<String> weekends= new ArrayList<>(Arrays.asList("Sunday", "Saturday" ));
boolean weekendsRemoved = weekdays.removeAll(weekends);
assert weekendsRemoved;
Desta forma, podemos garantir que todos os fins de semana são removidos dos dias da semana independentemente da asserção estar habilitada ou desabilitada. Como resultado, não afeta a operação do programa no futuro.
Java