Archive | Java Effective RSS for this section

Concorrência – Item 68

downloadPrefira executores e tarefas a thread

A partir do lançamento da versão 5, a plataforma Java fornece utilitários de concorrência de nível mais alto (java.util.concurrent) oferecendo inúmeras facilidades que antes os programadores tinham que gerenciar manualmente. Veja http://docs.oracle.com/javase/tutorial/essential/concurrency/index.html

A principal abstração que servia tanto de unidade de trabalho quanto mecanismo de execução conhecido como Thread foi separado em duas vertentes – Runnable e Callable. Portanto, não é mais indicado à criação manual de threads e principalmente de grupos lógicos de threads (pooling). O mecanismo preferível para criar e executar tarefas em paralelos é o ExecutorService que possui uma série de facilidades e otimizações. Consulte a documentação para todas as informações – http://docs.oracle.com/javase/tutorial/essential/concurrency/executors.html.

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

“A pessoa faz os seus planos, mas quem dirige a sua vida é Deus, o SENHOR.” Provérbios 16:9

Concorrência – Item 67

AUTORAMAS-E-SLOT-CAR-105228_imageEvite a sincronização excessiva

Na moderna era multicore, o custo real da sincronização excessiva não é o tempo de CPU gasto na obtenção e liberação de bloqueios. São na verdade as oportunidades de paralelismo perdidos, os atrasos impostos pela necessidade de assegurar que cada núcleo tenha uma visão consistente de memória e a limitação resultante que impede uma JVM de otimizar tais execuções de códigos. Portanto, sempre tente reduzir ao máximo o volume de código executado dentro de regiões sincronizadas. Parar evitar falhar de atividades e de segurança, nunca faça chamadas polimórficas dentro de blocos sincronizados. Ao projetar uma classe, pondere se existe uma boa razão para ela executar sua própria sincronização interna ou deixar com que o chamador se encarregue disso. Sempre documente tais situações no Java Doc.

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

Para ter sabedoria, é preciso primeiro pagar o seu preço. Use tudo o que você tem para conseguir a compreensão. Provérbios 4:7

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

Concorrência – 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

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.

Junte-se a 635 outros seguidores