Criando um método de fábrica genérico usando enums

0 respostas
wescleyfcosta

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 Enum
public 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");
	}
}
Porém ao tentar usar o teste para criar uma instância dela eu não consigo devido a falha de compilação Type mismatch: cannot convert AliadorLiderSolicitacao to Avaliador. Se tento outras combinações ele dá Warning dizendo que uma referência parametrizada deve ser utilizada e por ai vai. A classe de teste:
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

Criado 19 de maio de 2011
Respostas 0
Participantes 1