3
respostas

No padrão State, como faço para descobrir em qual estado a aplicação se encontra?

Boa tarde,

Quando foi descrito o problema, a primeira solução que imaginei foi utilizar um Enum para representar a lista de estados do objeto, e cada elemento do Enum receberia a lista de estados para o qual ele pode transitar. No final do exercicio essa solução ainda me pareceu mais limpa.

enum State{
APROVADO(FINALIZADO),
REPROVADO(FINALIZADO),
FINALIZADO(),
EM_APROVACAO(APROVADO,REPROVADO)
}

1- Quais são os pontos fracos dessa abordagem?

2- Muitas vezes surge a necessidade de uma outra classe que utiliza "Orcamento" se pergunta em qual estado o objeto "Orcamento" se encontra. Nesse caso penso em alterar a interface "EstadoDeUmOrcamento " para que as filhas retornem um elemento Enum representando seu estado.

StateEnum{
APROVADO
REPROVADO
FINALIZADO
EM_APROVACAO
}
interface EstadoDeUmOrcamento {
      StateEnum getState();
...
}

class Aprovado implements EstadoDeUmOrcamento { 
 StateEnum getState(){
   return APROVADO
 }
}
3 respostas

Em relação a usar enum, não tem nenhum problema.. Só não é tão comum no mundo java o programador colocar método que tem lógica dentro da enum.. Lembre que o estado sabe fazer outras coisas, além de manter apenas informação sobre o estado em si.. aplicar o desconto é um exemplo.

Em relação a segunda, não gosto... A enum já representa o estado e o orçamento tem um método que retorna o estado atual. É só chamar o orcamento.getEstado() que vc tem o estado.

Entendi.

Mais uma duvida. Caso seja necessario pegar da lista de Orcamentos , todos aqueles que foram finalizados. Nesse caso penso que deveria usar "instanceof".

orcamento.getEstado() instanceof Finalizado

Essa seria a melhor forma?

Oi Leonardo Eu acredito que para pegar a sua lista de orçamentos você deveria primeiramente salvar esse estado, para salvar os estados dos objetos em um histórico você poderia utilizar o padrão memento. Espero ter ajudado e bons estudos.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software