Bem galera até o momento estudei que não é apropriado colocar assertivas para validar argumentos de métodos públicos e numa instrução case. A questão abaixo diz totalmente ao contrário.
Para mim, a resposta certa seria a letra D ao invés de G.
O que vocês acham ?
QUESTION: 168
Given:
11. public void go(int x) {
12. assert (x > 0);
13. switch(x) {
14. case 2: ;
15. default: assert false;
16. }
17. }
18. private void go2(int x) { assert (x < 0); }
Which statement is true?
A. All of the assert statements are used appropriately.
B. Only the assert statement on line 12 is used appropriately.
C. Only the assert statement on line 15 is used appropriately.
D. Only the assert statement on line 18 is used appropriately.
E. Only the assert statements on lines 12 and 15 are used appropriately.
F. Only the assert statements on lines 12 and 18 are used appropriately.
G. Only the assert statements on lines 15 and 18 are used appropriately.
Answer: G
Tirei a certificação ano passado estudando pelo livro do Paul Sanghera, da Apress. Nele, é dito o seguinte sobre ASSERTIONS:
[quote]* Não utilize ASSERTIONS para verificar os argumentos passados para um método público. Existem duas razões para não fazer isso:
** Se a verificação de argumento é necessária, ela deve fazer parte das especificações do método e deve tornar-se parte do comportamento do método permanente. Lembre-se que as ASSERTIONS não são sempre ativada durante a execução.
** Passagem de argumentos errôneos deve resultar em exceções mais específicas e adequadas como IllegalArgumentException, IndexOutOfBoundsException, ou
NullPointerException. Isto também implica que você não deve usar as ASSERTIONS para verificar os argumentos de linha de comando.[/quote]
Isso mata a linha 12, mas não restringe a 18.
[quote]* Não use ASSERTIONS para impor o bom funcionamento exigidas pelo seu aplicativo porque, novamente, elas podem não ser ativadas durante a execução do aplicativo. Você não quer
contar com ASSERTIONS para verificar o comportamento correto de sua aplicação em execução. Por exemplo, você quer ter certeza de que um myList não possui elementos nulos. Fazendo o seguinte é um uso inadequado das ASSERTIONS:
Essa mudança não vai acontecer se as ASSERTIONs estiverem desabilitadas.[/quote]
Acho que isso mata a linha 15, pois está verificando o comportamente da aplicação.
Não implica aqui.
Enfim… concordo com você, acho que a resposta correta é a 18. Tente procurar uma ERRATA do livro da Kathy Sierra.
Abraço.
A linha 12 está errada pq voce está verificando um argumento passado para um método público.
A linha 15 está correta, quando você tem um ponto de seu código que você sabe que não pode cair, por exemplo, eu tenho um switch case, e ele NÃO pode cair no default.
Então eu coloco um assert(false) no default, o que quer me dizer, se cair nesse ponto que eu sei que NÃO pode cair, me lance um erro de assertion.
Portanto a linha 15 está correta.
A linha 18 está correta porque está verificando um argumento de um método private.
Resumindo, a resposta do livro está CORRETA.
abraços