Olá,
Tenho o seguinte problema agora: Imagine que tenha uma tela onde uma pessoa possa avaliar fluxo, sendo que essas avaliações são fixas e definidas em um Enum. Hoje tenho um conjunto de Managed Bean, Um XHTML e Um enum para fazer essas avaliação, sendo que managed bean tem uma instância de um serviço que executa a avaliação própriamente dito.
Acontece que existem 3 tipos diferentes de avaliações que obrigaram-me a fazer 3 XHTMLs e 3 MB sendo que eles são muito iguais. Pensando nisso eu pensei em abstrair esses comportamentos em comum a uma interface
public interface Avaliador<T extends Enum<T>> {
void avaliar();
public List<T> getOpcaoAvaliacaoList();
String getMotivo();
T getOpcaoAvaliacao();
boolean isExibeMotivo();
}
Onde o tipo T que está parametrizado seria um dos enums, e em cada classe que implementasse essa interface, eu teria que colocar seu respectivo tipo do enum durante a contrução do objeto
Exemplo da implementação de Avaliador para ums dos tipos de Enumpublic class AvalidorLiderSolicitacao<T extends Enum<T>> implements
Avaliador<OpcaoAvaliacaoLider> {
public void avaliar() {
// TODO Auto-generated method stub
}
public List<OpcaoAvaliacaoLider> getOpcaoAvaliacaoList() {
// TODO Auto-generated method stub
return null;
}
public String getMotivo() {
// TODO Auto-generated method stub
return null;
}
public OpcaoAvaliacaoLider getOpcaoAvaliacao() {
// TODO Auto-generated method stub
return null;
}
public boolean isExibeMotivo() {
// TODO Auto-generated method stub
return false;
}
public void setMotivo(String motivo) {
// TODO Auto-generated method stub
}
public void setSolicitacao(Solicitacao solicitacao) {
// TODO Auto-generated method stub
}
Para criar instâncias do avaliador eu criei uma Factory Method que recebe com parâmetro genérico a Classe do Enum que estou trabalhando
public class AvaliadorFactory {
public static <T extends Enum<T>> Avaliador<T> createAvaliador(
final Class<T> opcaoAvaliador) throws BusinessRuleException {
if (opcaoAvaliador.equals(OpcaoAvaliacaoLider.class)) {
return new AvalidorLiderSolicitacao<T>();
}
throw new BusinessRuleException("Opção de avaliação não é válida");
}
}
public class AvaliacaoFactoryTest extends AbstractTestCase {
public void testCriaFabricaAvaliarSolicitacao()
throws BusinessRuleException {
Avaliador<OpcaoAvaliacaoLider> avaliador = AvaliadorFactory
.createAvaliador(OpcaoAvaliacaoLider.class);
assertNotNull(avaliador);
}
}
Exemplo de um dos Enums:
public enum OpcaoAvaliacaoLider {
APROVADA("Aprovada"),
DEVOLVER_SAG("Devolver para a SAG"),
DEVOLVER_SOLICITANTE("Devolver para o solicitante/beneficiário"),
NAOAPROVADA("Não aprovada");
private final String descricao;
private OpcaoAvaliacaoLider(final String descricao) {
this.descricao = descricao;
}
@Override
public String toString() {
return descricao;
}
}
Queria saber se vocês veem algo de errado no modo como eu fiz?
sds