29
@regismelo 1 Assertions

Java cert programmer (assertions)

Embed Size (px)

DESCRIPTION

Java Assertions

Citation preview

Page 1: Java cert programmer (assertions)

@regismelo 1

Assertions

Page 2: Java cert programmer (assertions)

@regismelo 2

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.

Assertions

Page 3: Java cert programmer (assertions)

@regismelo 3

Por que usar Assertions?

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.

Page 4: Java cert programmer (assertions)

@regismelo 4

Por que usar Assertions?

Assertions

• Assertions vs. outro código de erro;

• Design-by-Contract

– Pré-condições;

– Pós-condições;

– Invariantes;

Page 5: Java cert programmer (assertions)

@regismelo 5

Sintaxe

Assertions

• assert expressao1;

Exemplo:

assert foo != null;

Equivalente a

if ( ! (foo != null) ) {

throw new AssertionError();

}

Page 6: Java cert programmer (assertions)

@regismelo 6

Sintaxe

Assertions

• assert expressao1 : expressao2;

Exemplo:

assert foo != null : “Assertion”;

Equivalente a

if ( ! (foo != null) ) {

throw new AssertionError(“Assertion”);

}

Page 7: Java cert programmer (assertions)

@regismelo 7

Compilando com Assertions

Assertions

• java –source 1.3

– usa a sintaxe antiga.

• java –source 1.4

– usa a sintaxe nova, com assertion.

Page 8: Java cert programmer (assertions)

@regismelo 8

Controlando Assertions

Assertions

• Linha de comando

Símbolo Exemplo______________

-ea java –ea

-da java –da

-ea:<classname> java –ea:AssertClass

-da:<classname> java –da:AssertClass

-ea:<packagename> java –ea:Package0

-da:<packagename> java –da:Package0

Page 9: Java cert programmer (assertions)

@regismelo 9

Controlando Assertions

Assertions

• Linha de comando

Símbolo Exemplo______________

-esa java –esa

-dsa java –das

esa = enable system Assretion

Page 10: Java cert programmer (assertions)

@regismelo 10

Controlando Assertions

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

Page 11: Java cert programmer (assertions)

@regismelo 11

Controlando Assertions

Assertions

• Programaticamente.

• Habilita o uso de assertions como default.

– public void setDefaultAssertionStatus(

boolean enabled);

• Desabilita o uso de todas as assertions.

– public void clearAssertionStatus();

Page 12: Java cert programmer (assertions)

@regismelo 12

Quando usar Assertions

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.

Page 13: Java cert programmer (assertions)

@regismelo 13

Quando usar Assertions

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.

Page 14: Java cert programmer (assertions)

@regismelo 14

Quando não usar Assertions

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.

Page 15: Java cert programmer (assertions)

@regismelo 15

Quando não usar Assertions

Assertions

• Como se fosse o seguinte:

– If (something) error();

• Como um controle condicional externo.

• Checar a corretude de seu compilador, sistema operacional ou hardware.

Page 16: Java cert programmer (assertions)

@regismelo 16

Exemplos(regras de uso)

Assertions

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;

}

}

Page 17: Java cert programmer (assertions)

@regismelo 17

Exemplos(regras de uso)

Assertions

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

}

}

Page 18: Java cert programmer (assertions)

@regismelo 18

Exemplos(regras de uso)

Assertions

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

}

}

Page 19: Java cert programmer (assertions)

@regismelo 19

Exemplos(regras de uso)

Assertions

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!”;

}

}

Page 20: Java cert programmer (assertions)

@regismelo 20

Exemplos(regras de uso)

Assertions

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!”;

}

}

Page 21: Java cert programmer (assertions)

@regismelo 21

Exemplos(regras de uso)

Assertions

Regra: usar assertions para reforçar suposições internas sobre aspectos de estruturas de dados.

private void showDate(int array[]) {

assert (array.length == 3);

}

Page 22: Java cert programmer (assertions)

@regismelo 22

Exemplos(regras de uso)

Assertions

Regra: usar assertions para checar condições no fim de qualquer método.

public void open() {

//...

isOpen = true;

//...

assert isOpen;

}

Page 23: Java cert programmer (assertions)

@regismelo 23

Exemplos(regras de uso)

Assertions

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!!!” }

}

Page 24: Java cert programmer (assertions)

@regismelo 24

Exemplos(regras de uso)

Assertions

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!!!”

}

Page 25: Java cert programmer (assertions)

@regismelo 25

Exemplos(regras de uso)

Assertions

Regra: usar assertions para checar condições relacionadas ao início de qualquer método.

public void processZipCode(String zipCode) {

assert zipCodeMapIsValid();

//.....

}

Page 26: Java cert programmer (assertions)

@regismelo 26

Exemplos(regras de uso)

Assertions

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();

}

}

Page 27: Java cert programmer (assertions)

@regismelo 27

Exemplos(regras de uso)

Assertions

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!”;

}

}

Page 28: Java cert programmer (assertions)

@regismelo 28

Exemplos(regras de uso)

Assertions

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();

}

}

Page 29: Java cert programmer (assertions)

@regismelo 29

Exemplos(regras de uso)

Assertions

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;

}