nadilsons:
Bom dia,
Implementei uma factory para camada DAO; e o tipo de retorno destas factories é uma interface IGenericDAO…
Tudo funciona bem, até que eu precisei implementar uma funcionalidade específica, cuja assinatura não existe na IGenericDAO; então para fazer uso deste método eu preciso fazer um casting… e isto está me incomodando pois eu acho que a responsabilidade do casting seria da factory, porém eu não vejo como implementar um modo da factory realizar este casting.
Alguém saberia um modo de realizar este casting na factory?
O cast não é tão ruim assim. Desde que vc faça cast de interfaces, é claro. Mas isso é assumir que o usuário da fábrica sabe demais sobre o que a fábrica produz. Isso é errado ? Não completamente, afinal, vc sabe o que uma fábrica de carros (dao) fabrica inclusive os modelos (dao simples, dao extentido) que ela fabrica
Mas como vc sabe sobre os modelos ? Porque a fábrica lhe informa ou porque vc analiza o que sai dela ?
Fazer cast é equivalente a analizar o que sai dela. Ter um método para cada tipo de produto equivale à fabrica informar o que sabe fazer.
Se vc não quer o cast, a solução é obviamente ter um método para cada tipo de dao. Ou em alternativa ter um método genérico, mais ou menos assim:
public <T extends DAO> T getDAO(Class<T> daoClass){
if (daoClass.equals(ExtendedDAO.class)){
return new AdvancedDAO ()
} else {
return new DefaultDAO ();
}
}
Uma alternativa seria simplesmente incluir os metodos extra na interface do DAO. Assim fica com apenas um tipo e é mais simples. Quando os métodos não poderem ser usado, simplesmente lance uma UnsupportedOperationException. E deixe claro no javadoc qual método pode ser chamado quando. Este mecanismo é usado pelo Java Collection Framework e funciona. O problema é que esconde a informação até ao momento em que vc executa o codigo, obrigando a ler muito bem o javadoc. No caso do JCF isso faz sentido, no caso de uma fabrica de daos tlv não faça.
Finalmente, uma fabrica de daos é um DAOFactory e não um FactoryDAO (que seria um DAO para objectos do tipo Factory. Compare com ClienteDAO)