2. Assertions
Objetivos
• Saber quando, como e em quais situações
usar assertions.
• Como compilar código-fonte, controlar a
execução do programa, adicionar e
remover assertions.
@regismelo 2
3. Assertions
Por que usar Assertions?
• Como programadores, devemos fazer mais do
que checagem de erro.
• Código de tratamento de erro inclui uma
quantidade substancial de esforço de
programação.
• Não é possível eliminar todos os erros, mas
podemos planejar à frente do inesperado.
• Assertion pode ser usado para capturar
condições que não esperávamos acontecer.
@regismelo 3
4. Assertions
Por que usar Assertions?
• Assertions vs. outro código de erro;
• Design-by-Contract
– Pré-condições;
– Pós-condições;
– Invariantes;
@regismelo 4
5. Assertions
Sintaxe
• assert expressao1;
Exemplo:
assert foo != null;
Equivalente a
if ( ! (foo != null) ) {
throw new AssertionError();
}
@regismelo 5
7. Assertions
Compilando com Assertions
• java –source 1.3
– usa a sintaxe antiga.
• java –source 1.4
– usa a sintaxe nova, com assertion.
@regismelo 7
9. Assertions
Controlando Assertions
• Linha de comando
Símbolo Exemplo______________
-esa java –esa
-dsa java –das
esa = enable system Assretion
@regismelo 9
10. Assertions
Controlando Assertions
• Programaticamente.
• Habilita ou desabilita o uso de assertions para uma
classe.
– public void setClassAssertionStatus(
String className, boolean enabled);
- Habilita ou desabilita o uso de assertions para um
pacote.
– public void setPackageAssertionStatus(
String packageName, boolean enabled);
@regismelo 10
11. Assertions
Controlando Assertions
• Programaticamente.
• Habilita o uso de assertions como default.
– public void setDefaultAssertionStatus(
boolean enabled);
• Desabilita o uso de todas as assertions.
– public void clearAssertionStatus();
@regismelo 11
12. Assertions
Quando usar Assertions
• Reforçar suposições sobre aspectos de
estruturas de dados.
• Reforçar constraints em argumentos de
métodos private.
• Checar condições que nunca deveriam ocorrer.
• Checar condições que nunca deveriam ocorrer,
mesmo que você esteja certo disso.
@regismelo 12
13. Assertions
Quando usar Assertions
• Checar condições relacionadas ao início de
qualquer método.
• Checar coisas no meio de loops grandes.
• Qualquer assertion é melhor do que nada.
@regismelo 13
14. Assertions
Quando não usar Assertions
• Reforçar o uso na linha de comando.
• Reforçar constraints em argumentos de
métodos públicos.
• Reforçar uso público de padrões ou protocolos.
• Reforçar uma propriedade de qualquer
informação de um usuário.
@regismelo 14
15. Assertions
Quando não usar Assertions
• Como se fosse o seguinte:
– If (something) error();
• Como um controle condicional externo.
• Checar a corretude de seu compilador, sistema
operacional ou hardware.
@regismelo 15
16. Assertions
Exemplos(regras de uso)
Regra: não usar assertions para reforçar o uso da
linha de comando.
public class Application {
public static void main(String[] args) {
//BAD!!
assert args.length == 3;
}
}
@regismelo 16
17. Assertions
Exemplos(regras de uso)
Regra: usar assertions para reforçar o uso de
constraints de argumentos para métodos
private.
public class aClass {
private void method(Object required, Object optional) {
assert (required != null) : “method():required = null”;
}
}
@regismelo 17
18. Assertions
Exemplos(regras de uso)
Regra: não usar assertions para reforçar
constraints de argumentos para métodos public.
public class aClass {
public void disconnect(Source required, Object optional)
{
//BAD!!
assert (required != null) : “method():required = null”;
}
}
@regismelo 18
19. Assertions
Exemplos(regras de uso)
Regra: não usar assertions para reforçar uso
público de padrões ou protocolos.
public class Connection {
private boolean isOpen = false;
public void close() {
//BAD!!
assert isOpen : “Cannot close a connection!”;
}
}
@regismelo 19
20. Assertions
Exemplos(regras de uso)
Regra: não usar assertions para reforçar uma
propriedade de uma informação de usuário.
public void processZipCode(String zipCode) {
if (zipCode.length() == 5) { //ok }
else {
//BAD!!
assert false:”Only 5- and 9- digit supported!”;
}
}
@regismelo 20
21. Assertions
Exemplos(regras de uso)
Regra: usar assertions para reforçar suposições
internas sobre aspectos de estruturas de dados.
private void showDate(int array[]) {
assert (array.length == 3);
}
@regismelo 21
22. Assertions
Exemplos(regras de uso)
Regra: usar assertions para checar condições no
fim de qualquer método.
public void open() {
//...
isOpen = true;
//...
assert isOpen;
}
@regismelo 22
23. Assertions
Exemplos(regras de uso)
Regra: usar assertions para checar condições
que nunca aconteceriam.
public void method() {
int a = getValue(); //returns 0
if (a == 0) { //deal with 0 }
else { assert false : “Impossible!!!” }
}
@regismelo 23
24. Assertions
Exemplos(regras de uso)
Regra: usar assertions para checar condições que
nunca aconteceriam, mesmo que você tenha
certeza.
public void method() {
int a = getValue(); //returns 0
assert a < 0 || a > 0 : “Impossible!!!”
}
@regismelo 24
25. Assertions
Exemplos(regras de uso)
Regra: usar assertions para checar condições
relacionadas ao início de qualquer método.
public void processZipCode(String zipCode) {
assert zipCodeMapIsValid();
//.....
}
@regismelo 25
26. Assertions
Exemplos(regras de uso)
Regra: usar assertions para checar coisas no meio
de um loop grande.
public void method() {
while (true) {
Socket socket = serverSocket.accept(); //long pause
assert socketListIsValid();
}
}
@regismelo 26
27. Assertions
Exemplos(regras de uso)
Regra: não usar assertions como algo do tipo: “if
(something) error();”
public class Server {
private int port;
public void listen() {
//BAD!!
assert port >= 1024 : “No permission to listen!”;
}
}
@regismelo 27
28. Assertions
Exemplos(regras de uso)
Regra: não usar assertions como uma condição de
controle externa.
public class App {
static private boolean turnLoggingOn() { return true; }
static public void main(String[] args) {
//BAD!!
assert turnLoggingOn();
}
}
@regismelo 28
29. Assertions
Exemplos(regras de uso)
Regra: não usar assertions para checar a
corretude de seu compilador, sistema
operacional ou hadware, a não ser que você
esteja depurando.
public void method() {
int a = 10;
//REDUNDANT!!
assert a == 10;
}
@regismelo 29
Notas do Editor
Assertions podem ser usados para garantir pré-condições se e somente se o método não é público. Assertions são sempre bons para pós-condições. Invariantes são condições que devem ser sempre verdadeiras.
expressao_2 pode ser qualquer tipo suportado pelos construtores da classe AssertionError, que são: object, boolean, char, int, long, float, double.
expressao_2 pode ser qualquer tipo suportado pelos construtores da classe AssertionError, que são: object, boolean, char, int, long, float, double.
Na opção java –source 1.4, assertion é uma nova keyword.
Assertions são desabilitados por default. Pode-se usar combinações desses símbolos. Por exemplo, habilitar as assertions num pacote e desabilitar para uma classe em particular(java –da:pacoteX –ea:classeX).
Os métodos pertencem à classe ClassLoader. className – nome da classe que o comando afetará. enabled - indica se a assertion será ou não aplicada.
packageName – nome do pacote que o comando afetará. enabled - indica se a assertion será ou não aplicada. Lembre-se de setar esses flags antes de carregar as classes que você quer que sejam afetadas. Remover assertions é fortemente desencorajado, a não ser que se tenha uma boa razão.
packageName – nome do pacote que o comando afetará. enabled - indica se a assertion será ou não aplicada. Lembre-se de setar esses flags antes de carregar as classes que você quer que sejam afetadas. Remover assertions é fortemente desencorajado, a não ser que se tenha uma boa razão.