Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Sugestão] Ideia de implementacao do pattern "State" com Enum

Tive uma ideia de implementação utilizando o próprio Enum do java. Não sei sei tem alguma limitação, mas pelo menos para a regra de negócio em questão parece funcionar bem. O que acham?

package state;

import java.math.BigDecimal;

public enum Situacao {
    APROVADO{
        @Override
        public void finalizar(Orcamento orcamento) throws Exception {
            orcamento.setSitucao(Situacao.FINALIZADO);
        }
        
        @Override
        public BigDecimal calcularDescontoExtra(Orcamento orcamento) {
            return orcamento.valor.multiply(new BigDecimal("0.02"));
        }
    },
    REPROVADO{
        @Override
        public void finalizar(Orcamento orcamento) throws Exception {
            orcamento.setSitucao(Situacao.FINALIZADO);
        }
    },
    EM_ANALISE{
        
        @Override
        public void aprovar(Orcamento orcamento) throws Exception {
            orcamento.setSitucao(Situacao.APROVADO);
        }
        
        @Override
        public void reprovar(Orcamento orcamento) throws Exception {
            orcamento.setSitucao(Situacao.REPROVADO);
        }
        
        @Override
        public BigDecimal calcularDescontoExtra(Orcamento orcamento){
            return orcamento.valor.multiply(new BigDecimal("0.05"));
        }
        
    },
    FINALIZADO;
    
    public void aprovar(Orcamento orcamento) throws Exception {
        throw new Exception("Não pode ser aprovado");
    }
    
    public void reprovar(Orcamento orcamento) throws Exception {
        throw new Exception("Não pode ser aprovado");
    }
    
    public void finalizar(Orcamento orcamento) throws Exception {
        throw new Exception("Não pode ser aprovado");
    }
    
    public BigDecimal calcularDescontoExtra(Orcamento orcamento) {
        return BigDecimal.ZERO;
    }
    
}
1 resposta
solução!

Olá, Luiz!

Gostei da sua ideia de implementação utilizando o Enum do Java para o padrão de projeto "State". Parece uma solução interessante e adequada para a regra de negócio em questão. O uso do Enum permite definir os diferentes estados possíveis de uma situação e associar comportamentos específicos a cada estado.

No exemplo que você compartilhou, cada valor do Enum representa um estado possível (APROVADO, REPROVADO, EM_ANALISE, FINALIZADO) e possui métodos que definem as ações que podem ser realizadas em cada estado. Além disso, é possível calcular descontos extras com base na situação atual.

Uma vantagem dessa abordagem é que ela torna o código mais legível e fácil de entender, pois os diferentes estados e comportamentos estão claramente definidos no Enum. Além disso, evita o uso de condicionais complexas para controlar o comportamento do objeto de acordo com o estado.

No entanto, é importante ressaltar que o uso do Enum para implementar o padrão "State" pode ter algumas limitações, dependendo do contexto do seu projeto. Por exemplo, se houver a necessidade de adicionar novos estados ou comportamentos dinamicamente, pode ser mais difícil de alcançar com o Enum. Nesse caso, outras abordagens, como o uso de classes abstratas ou interfaces, podem ser mais adequadas.

No geral, acredito que a sua implementação utilizando o Enum é uma boa solução para o padrão "State" no contexto apresentado. Se ela atende aos requisitos do seu projeto e facilita a manutenção e compreensão do código, não vejo problemas em utilizá-la.

Espero ter ajudado e bons estudos!