Enums são objetos com estado e comportamentos

Eu não sei você, mas por muito tempo eu subestimei e encarei as enums no meu código apenas como simples constantes…

public enum TipoDeDocumento {

    RG,
    CPF,
    CNPJ;
}

Isto foi um grande erro, pois enums são tão poderosas quanto objetos Java… na verdade, enums são objetos e você deveria encará-las dessa forma! Tratá-las apenas como substitutos para uma lista de constantes do tipo int ou String é ignorar todo o potencial das enums e da orientação a objetos no seu código!

Uma enum pode ser tão completa quanto um objeto Java qualquer, isto é, uma enum pode ter dados (estado) e comportamentos. O código a seguir com uma enum possuindo estas características pode te dar uma idéia sobre o que estou falando:

public enum TipoDeDocumento {

    RG("RG", new ValidadorDeRg()),
    CPF("CPF", new ValidadorDeCpf()),
    CNPJ("CNPJ", new ValidadorDeCnpj());

    private String descricao;
    private Validador validador;

    private TipoDeDocumento(String descricao, Validador validador) {
        this.descricao = descricao;
        this.validador = validador;
    }

    /**
     * Valida número do documento
     */
    public boolean valida(String numero) {
        return this.validador.isValido(numero)
    }
}

Talvez só olhando o código não seja fácil compreender o poder das enums, então para você entender o que eu estou falando realmente eu te convoco a dar uma olhada nesse novo post no blog da Triadworks:

>> Enums são mais que constantes

O post também aborda algumas práticas sobre orientação a objetos que deixamos de usar por não compreender que enums são objetos com dados e comportamentos.

E aí, o que achou do post?

Economize memória com o padrão Flyweight

Quando desenvolvemos jogos é muito comum termos diversas entidades do mesmo tipo em um cenário, como inimigos, projéteis, nuvens, efeitos etc. Criar sempre novos objetos para cada entidade que surge na tela é algo custoso para JVM, tanto em performance quanto em uso de memória.

Para minimizar o uso desnecessário de recursos da máquina ou dispositivo, nós podemos utilizar o padrão Flyweight, na qual se encarregaria de criar apenas um único objeto em memória e compartilhá-lo pelo resto do jogo ou aplicação. A idéia é simples mas os ganhos são consideráveis!

Para exemplificar bem o uso deste padrão de projeto, nós da TriadWorks escrevemos um post sobre o assunto com direito a exemplos! Vale a pena dar uma olhada e ver se esse padrão se encaixa no seu projeto!

Para não perder nenhum post no blog dos instrutores da TriadWorks, você pode se inscrever na nossa página (fica no rodapé!) e receber um email sempre que um novo post for lançado! Ah! Nós estamos tentando blogar toda segunda-feira pela manhã, então fica de olho!

Identidade da Entidade

Defina a identidade da sua entidade

Um dos princípios básicos da orientação objetos é que toda entidade deve ter um identidade. Esse princípio é tão importante que se não o levarmos a sério podemos ter problemas nas nossas lógicas de negócio e muitas vezes nos frameworks que trabalhamos, como JSF ou JPA/Hibernate.

Na linguagem Java a identidade de um objeto é definida através do métodos equals e hashCode. Implementá-los de forma correta pode evitar problemas quando trabalhamos com componentes de seleção no JSF (como h:selectOneMenu ou h:selectManyMenu) ou quando implementamos nossos conversores genéricos de entidades, por exemplo!

Para melhor entender a necessidade de definir a identidade de suas entidades, você pode ler meu post no blog dos desenvolvedores e instrutores da TriadWorks! Lá além de abordarmos temas como design de classes e Domain-Driven Design (DDD), nós também comentamos sobre algumas boas práticas quanto a maneira correta de implementar os métodos equals e hashCode ao trabalhar com Hibernate!