Os 10 mandamentos do bom programador Java

Escrever bom código é o primeiro passo para ser bom programador. Existem algumas boas práticas relativas a como o código deve ser organizado, mas existem alguns princípios básicos que qualquer programador – por mais inexperiente que seja – deve saber e seguir.

1. Conheça e use as bibliotecas padrão

Existe um imenso ganho em conhecer a API padrão. Sobretudo os pacotes java.util java.util.concurrent e java.io. A API de coleções é extremamente importante.

Conhecer a API padrão não só lhe dará um conhecimento profundo da linguagem e da plataforma mas também o poupará de implementar algoritmos complexos. Use os que a API oferece porque eles foram criados por engenheiros experientes e testados por milhares de pessoas em todo o mundo.

2. Minimize a acessibilidade dos membros das suas classes

Isto é simples. Declare todos os atributos de estado como private , mesmo quando você decidir que subclasses devem acesso a eles, nunca os declare protected. Declare métodos protected em vez. Declare os construtores privados e forneça métodos estáticos para construir o objeto (métodos-fábrica). Não coloque métodos modificadores (set) a não ser que precise deles. Coloque apenas os acessores (get). Para inicializar o objeto passe os atributos no construtor ou no método estático de fábrica.

As vantagens são inúmeras porque você estará aumentado a possibilidade de encapsular comportamento ao mesmo tempo que diminui a superfície exposta da sua classe.

3.Prefira composição em vez de herança

Se o seu objeto parece ser uma lista, não o faça estender List, em vez faça-o ter um List como atributo interno.  Se o seu objeto parece ser um usuário, talvez seja melhor que ele tenha um atributo usuário internamente.

Herança é um recurso poderoso, mas escaço. Uma vez que tenha usado o seu recurso de herança não mais o poderá alterar. Nunca. Portanto, adie o uso de herança o máximo possível.

4. Implemente criteriosamente o método equals para os seus objetos. Implemente também hashCodee toString

Implementar equals é um pouco mais complexo do que parece. Sempre que equals for sobrescrito você precisa também sobrescrever hashCode já que dois estão relacionados. toString é bom implementar porque é muito util para debug e conversões do objeto para String.

5. Use Enum em vez de int

Utilize Enum em vez de constantes definidas com int.
O tipo Enum foi criado exatamente para isso, então use-o em seu beneficio.

O Enum tem ainda a curiosa propriedade de poder servir para criar um verdadeiro Singleton em Java, contudo, evite singletons e prefira o uso do padrão Registry.

6. Prefira Interfaces para definir tipos, e apenas para isso.

Ao programar sempre defina as suas variáveis, retorno de métodos e parâmetros de métodos com interfaces. Ao definir hierarquias sempre comece por definir uma interface. Prefira a interface à classe abstrata. Utilize a classe abstrata como uma implementação padrão/ utilitária da interface, mas não para definir o tipo do objeto.

Nunca utilize interfaces para definir constantes. Isso é uma prática obsoleta. Prefira
Enum para esse tipo de funcionalidade.

7. Lide com exceções da forma certa

Não semeie codigo try-catch pelo seu sistema à toa. Faça-o apenas na fronteira da camada e use-o da forma certa. Não logue todas as exceções que se lembrar em todos os cantos do código. Deixe o try-catch no fronteira da camada tratar disso.
Use exceções não-verificadas a menos que esteja desenhando uma API ou camada que será usada por outros em muitos projetos. Use exceções verificadas sempre que a API estiver utilizando recursos de hardware, do sistema operacional ou outros que consumam recursos e/ou sejam lentos de inicializar ( por exemplo, threads e conexões de rede)

Nunca, nunca, ignore exceções. Nunca faça isso. Nunca.

Sempre documente as exceções que os seus métodos lançam. Que sejam de validação de parâmetros, quer sejam relativas à lógica interna do método.

8. Sempre verifique a validade dos parâmetros que recebe

Ao definir um método, defina que valores são válidos e quais não são válidos para cada parâmetro. Sempre que encontrar algum parâmetro inválido interrompa o funcionamento do método lançando uma exceção.
Faça a verificação no inicio do método para evitar alocar recursos que não serão usado e para evitar verificações repetidas no meio do código.

Mesmo quando os parâmetros veem de outros pontos do seu sistema, sempre faça a verificação. Encare isso como uma medida de segurança e não como um estorvo. Por exemplo, em um sistema web, mesmo que um codigo javascript tenha validado os campos do cadastro, faça uma nova verificação do lado do servidor.

9. Use o tipo certo para o trabalho

Não use double ou float a menos que saiba o que está fazendo.Sobretudo nunca use estes tipos para conter dados que representem valores monetários. Como 0.1 e 0.01 não são representáveis desta forma, mas são muito comuns em quantidades financeiras o seu sistema está votado a criar erros de arredondamento, que podem significar perder dinheiro real. Não faça isso.

Se quer fazer contas com valores exatos utilize BigDecimal. Para trabalhar com dinheiro use o padrão Money.

Não utilize Calendar para representar ponto no tempo, use Date ou long. Use Calendar apenas para fazer cálculos ou conhecer informações especificas da data, como por exemplo qual foi o dia da semana.

Principalmente nunca use String quando outro tipo é mais apropriado. Se esse tipo não existe, crie-o. Dê uma olhada no padrão Tiny Type para o ajudar.

10. Saiba implementar Comparable e Cloneable

Comparable indica que o objeto representa algo que pode ser ordenável, tal como datas, textos e números podem. É útil sobretudo quando você sente a necessidade de ter ou apresentar os objetos dessa classe em ordem. Contudo só pode ser usado se o objeto apenas suporta uma única forma de ordenação. Por exemplo, datas só podem ser ordenados por ordem cronológica, mas clientes podem ser ordenados por nome, data de nascimento, numero de comprar, valor das compras , etc.. Implemente Comparable apenas nas classes que só suportam um tipo de ordenação. Para os outros objetos ( como cliente) pode criar classes à parte para cada tipo de comparação, que implementem Comparator.

Cloneable indica que o objeto pode ser copiado. É preciso ter cuidado ao implementar Cloneable. Você só deve implementar Cloneable quando tiver a certeza que isso não terá efeitos secundários. Por exemplo, se a sua classe não é final e implementar Cloneable as classes filhas terão que sobrescrever esse método. O problema é que elas podem se esquecer de fazer isso, e você terá o problema de ao clonar um objecto da classe filha obter um objeto da classe pai. Em vez de Cloneable considere implementar um construtor de cópia. Um construtor de cópia é um construtor que recebe um objeto da mesma classe e copia o estado desse objeto. Aqui também é preciso ter muito cuidado para não fazer os dois objetos partilhares o mesmo estado. Em caso de dúvida não implemente Cloneable.

18 opiniões sobre “Os 10 mandamentos do bom programador Java”

  1. Falaaaa Sérgio !!!!!
    Bom, estou lendo o seu Post e essas colocações eu achei legal mesmo, um atalho para quem quer trilhar de forma pratica para o desenvolvimento.
    – Entretanto gostaria de lhe fazer uma pergunta ? Essas observações são de pesquisas e biografias ou você tem esse porte de vivência em n-projetos.Pois cria-se uma regra onde em projetos poderiam tomar vários rumos, todavia você tá focando em código java em especifico mas se muda a especificação ou versão da Vm não mudamos a regra de se codificar também.

    1. Enteressa sim a proviniencia da das observacoes mas tambem conta o conteudo dessas observacoes sejam elas de n-projectos ou de outros autores o certo e quee bati tudo certo se encaixo nos segredos de um develop

  2. Sergio, bom dia.
    Sobre o padrão Tiny Type, onde consigo mais informações.
    Pois “googleando”, não consegui nada.
    Obrigado.

  3. Sim, realmente é dificil. Isso é porque a ideia por detrás do nome é muito simples : não use Strings ou tipos numéricos quando pode usar objetos tipados. O exemplo classico é o CEP , telefones ou o CPF. São numeros ? Strings ? arrays de digitos ? Nada disso. Eles tem a sua propria existencia. A ideia é criar uma classe CEP, uma classe Telefone e uma classe CPF de maneira a deixar claro os atributos de métodos.
    por exemplo método abrirConta(CPF cpf) é mais claro e fortemente tipado que abrirConta (String cpf).
    É só isso. Forçar a tipagem forte das “coisas” do seu sistema, mesmo quando são “pequenas” coisas. Mais sobre este assunto aqui

  4. faltou alguns mandamentos importantes:

    11 – Se caso precisar usar herança que a mesma venha de uma classe abstrata criada por ti para suas classes posteriores de trabalho, evite o máximo herda de classes comuns.

    12 – Se teu trabalho será um sistema, então faça que suas classes de trabalho sejam classes finais, e selecione bem aquelas que merecem serem públicas.

    1. Nao e a melhor pratica definir todas as tuas classes como final…Um dos conceitos chaves do java e o reiaproveitamento do codigo para…Agora imagine que queiras fazer uma nova aplicacao amanha vais comecar tudo de novo? O que vem a ser javabean para ti?

  5. Faltou uma.
    Não tenha medo do desconhecido. As vezes sua solução pode vir de um pacote que começa com jt.ed.idontknow.

  6. Já vi esses mandamentos em algum lugar… Não estariam no livro Java Efetivo? Por favor, quando for copiar de algum lugar dê os créditos a quem merece.

    1. O crédito é realmente de quem merece. E eu lhe dou todo o crédito de não saber do que está falando.
      É de boa educação e de boa moral não levantar falsos testemunhos.
      Se você já leu o livro do Joshua sabe muito bem que não constam 10 mandamentos nele.

      Os 10 mandamentos são derivados da minha experiencia com Java e com a coordenação e coaching de equipes Java.
      Os programadores Java de todas as esferas e classes comentem demasiados erros básicos para o meu gosto.
      E a maior parte deles deriva do desrespeito a um dos 10 mandamentos.

    2. Eu nao consigo entender , porque uma pessoa vem somente entrar em um Debate para simplesmente descredenciar o outro.
      É chato não mostrar pagina referente e atestar a obra e pior fazer sitações de calunias.

    3. Nao e justo tratar o promotor do debate dessa forma eu no meu caso fiquei sabendo dos segredos porque ele me deu a conhecer

  7. Excelente abordagem !
    Seria mais “Os 10 mandamentos do bom programador”. Isto serve para qualquer linguagem OO que preste =D

    O caminho para tornar-se um programador de verdade é longo, mas muito gratificante.

    Novamente parabéns pelas suas publicações. Estou sempre lendo suas publicações o/

    Um abraço !

Deixe um comentário