Archive | Java Effective RSS for this section

Java Effective – Aprenda a programar em Java

51+QT0CAoEL._SX384_BO1,204,203,200_Se você já estudou um segundo idioma e tentou usa-lo fora da sala de aula, sabe que ha três coisas que você deve dominar: como o idioma é estruturado (gramática), como nomear as coisas ass quais se deseja falar (vocábulo) e as maneiras costumeiras e efetivas de dizer coisas cotidianas (modo de uso). Com frequência só as primeiras duas são abordadas na sala de aula e é comum vermos pessoas que nasceram falando o idioma escondendo risinhos quando tentamos nos fazer compreender.

Tudo isso é semelhante com a linguagem de programação Java. Você tem que entender a gramática: fundamentos da linguagem, se ela é algorítmica, funcional, orientada a objetos? Tem que conhecer o vocábulo: que dados, estruturas, operações e recursos são fornecidos pelas bibliotecas padrão? E precisa estar familiarizado o modo de uso: quais as maneiras costumeiras e efetivas de estruturar o código? Geralmente os livros sobre linguagem de programação Java abordam somente a gramática e o vocábulo, deixando o modo de uso totalmente a parte.

Este livro tem o objetivo exclusivo de ensinar a terceira necessidade, o uso costumeiro e efetivo da linguagem Java. Pelo que eu ando percebendo nas minhas consultorias é algo que tem sido deixando totalmente de lado pelos profissionais Java. Sendo assim é altamente recomendado para aqueles interessados em deixarem de ser “crianças” para se tornarem verdadeiros “profissionais”. Eu costumo dizer nas minhas consultorias e palestras que é impossível uma pessoa ser um “Profissional Java” sem ter lido e assimilado estas diretrizes. Infelizmente não existem mais desculpas, uma vez que já temos livro até em português com preço bem acessível.

Ja faz algum tempo que eu venho resumindo e postando cada item do livro como material de estudo – material de referência e estudos.

“Pois todo o que pede, recebe; o que busca, encontra; e àquele que bate, a porta será aberta.” Lucas 11:10

Exceções – Item 66

autorama-5Sincronize o acesso a dados mutáveis compartilhados

Quando várias threads compartilharem dados mutáveis, é necessário que cada thread faça a operação de leitura e gravação aos dados de forma sincronizada. Caso contrário, não haverá garantias que as mudanças feitas de uma thread fiquem visíveis para outra, devido a uma possível otimização usada pelas JVM chamadas de “hoisting”.

As consequências são comportamentos não determinísticos, falhas de atividades e de segurança que são difíceis de depurar e podem ser intermitentes, dependendo de tempo e comportamento do programa que podem também variar radicalmente de uma JVM para outra. A melhor maneira de evitar essa situação ainda é escrever um programa que evite o compartilhamento de dados mutáveis entre threads concorrentes.

Para todas as informações, veja o post inicial.

“Exorta os velhos a que sejam temperantes, sérios, sóbrios, sãos na fé, no amor, e na constância” Tito 2:2

Exceções – Item 65

dontignoremeNão ignore as exceções

Um bloco catch vazio invalida os fundamentos e a finalidade das exceções (checadas e não checadas) que é forçar a manipulação de condições excepcionais. Caso você tenha alguma situação no qual realmente não faça sentido fazer nenhuma implementação coerente em um tratamento de exceção, use uma das abordagens:

  • Comentário de código – nó mínimo escreva um comentário dentro do catch explicando o porquê foi apropriado não fazer nada com aquela condição de exceção.
  • Log – registre os ocorridos em um recurso de log apropriado.

Para todas as informações, veja o post inicial.

“Grande paz têm os que amam a tua lei; para eles não há tropeço. Salmos 119:165

Exceções – Item 64

bombanuclear_hypesciencepontocomBusque atomicidade das falhas

Após um objeto lançar uma exceção, é desejável que ele continue em um estado bem definido e usável. Resumidamente, uma chamada de método incorreta deve deixar um objeto no estado que ele estava antes da chamada. Existem algumas abordagens para obter esse efeito:

  • Usar objetos imutáveis (Item 15) – se uma operação falhar, um novo objeto imutável não será criado e consequentemente não deixara o antigo em um estado inconsistente.
  • No uso de objetos mutáveis – verifique e valide todos os parâmetros antes de execução da operação (Item 38), fazendo a exceção ser lançada antes de qualquer alteração interna.
  • Código de recuperação – criar um código que armazene e reverta seu estado ao ponto anterior de inicio da operação.
  • Cópia temporária – criação de cópia temporária do objeto a ser processado e a substituição do conteúdo do objeto pela cópia, uma vez que a operação tiver sido concluída com sucesso.

A busca dessa atomicidade nem sempre é desejável, uma vez que para alcançar essa característica você pode aumentar significativamente o custo, complexidade de sua solução e até ocasionar perda de performance na solução.

Como regra sempre busque usar a atomicidade. Onde esse regra não for aplicável, a documentação da API (Item 44) deve indicar claramente em que estado o objeto poderá ser deixado.

Para todas as informações, veja o post inicial.

“Tornai-vos, pois, praticantes da palavra e não somente ouvintes, enganando-vos a vós mesmos.” Tiago 1:22

Exceções – Item 63

os-pequenos-detalhes-sao-sempre-os-maisInclua informações de captura de falha em mensagens de detalhe

Quando um programa falha devida a uma exceção não checada, a JVM automaticamente exibe o rastreamento de pilha de execução com a descrição texto da determinada exceção. Estas costumam serem as únicas informações que os programadores ou o pessoal de serviço de campo têm quanto investigam uma falha no software. Portanto, é criticamente importante que o método toString() da exceção retorne o máximo possível de informações com relação a causa da falha.

Diante disso, é altamente recomendável que a mensagem de detalhe de uma exceção contenha os valores de todos os parâmetros e campos que contribuíram para gerar a falha do sistema. A abordagem que garante essa prática é assegurar que os construtores das determinadas exceções recebam como parâmetros os valores necessários para construir uma mensagem que ocasionaram a condição de exceção.

Para todas as informações, veja o post inicial.

“Ditoso o homem que se compadece e empresta; ele defenderá a sua causa em juízo.” Salmos 112:5

Exceções – Item 62

jmx-javadocDocumente todas as exceções lançadas por cada método

Uma descrição das exceções lançadas por um método é parte importante da documentação requerida para uso apropriado do método. Portanto, é criticamente importante que você documente cuidadosamente todas as exceções lançadas em cada método que você criar. Isso deve ser feito para exceções checadas e não checadas, para métodos concretos e abstratos. Se você não documentar toda as exceções, será difícil ou impossível para outras pessoas fazerem uso efetivo de suas classes e interfaces.

Para todas as informações, veja o post inicial

“Pois não me envergonho do evangelho, porque é o poder de Deus para a salvação de todo aquele que crê, primeiro do judeu e também do grego.” Romanos 1:16

Exceções – Item 61

do it - procrastination conceptLance exceções apropriadas à abstração

Existem alguns problemas quando uma API lança uma exceção referente à invocação de uma camada de nível inferior:

  • A exceção repassada não tem conexão aparente com a tarefa requisitada a ser executada do ponto de vista da camada invocadora.
  • Exposição detalhes de implementação interna da camada em uso.
  • Poluição da camada invocadora referente aos detalhes de implementação interno da camada em uso.
  • Inflexibilidade na manutenção. Quando detalhes internos de uma camada forem alteradas, resultara em impacto em todas as suas camadas invocadoras.

Portanto, as camadas superiores devem encapsular totalmente os detalhes e situação excepcionais internos, utilizando uma das seguintes abordagens:

  1. Encadeamento de exceções – definir e lançar exceções coerentes com o nível de abstração oferecida, encapsulando os detalhamentos internos. Use o encadeamento de exceções oferecido pela classe Exception.
  2. Contorno Silencioso – tratar as situações excepcionais internos transparentemente para as camadas invocadoras, registrando os ocorridos em um recurso de log apropriado.

Para todas as informações, veja o post inicial

“Pois a nossa pátria está nos céus, de onde também aguardamos o Salvador, o Senhor Jesus Cristo.” Filipenses 3:20

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.

Junte-se a 611 outros seguidores