O sistema que estou desenvolvendo na minha empresa faz uso intenso de tipos genéricos. Vejam este método:
[code]
public E getObject(E entidade) throws HibernateException {
@SuppressWarnings("unchecked")
E myObject = (E) session.get(entidade.getClass(), entidade.getId());
return myObject;
}[/code]
A interface Entidade é implementada por todos as classes mapeadas no Hibernate. Se eu quiser recuperar no banco uma instância de Pessoa com o id 1, basta chamar getObject(pessoa), onde pessoa é um objeto da classe Pessoa com o id = 1.
Esse caso está ok. Vamos vejam este método:
[code]
public List listar(E entidade) throws NomusException {
try {
Criteria criteria = session.createCriteria(entidade.getClass());
@SuppressWarnings("unchecked")
List<E> entidades = criteria.list();
return entidades;
} catch(Exception e) {
e.printStackTrace();
throw new NomusException(e.getMessage());
}
}[/code]
Este método lista todos os registros de uma determinada entidade. Também passamos como parâmetro um objeto entidade, mas reparem que neste caso bastaria passar a classe da entidade para o session.createCriteria(Class persistentClass), não precisa do objeto inteiro. Hoje nós somos obrigados a chamar o método assim:
listar(new Pessoa())
Mas eu gostaria que fosse assim:
listar(Pessoa.class)
Poderíamos fazer isso:
[code]
public List listar(Class classeEntidade) throws NomusException {
try {
Criteria criteria = session.createCriteria(classeEntidade);
List entidades = criteria.list();
return entidades;
} catch(Exception e) {
e.printStackTrace();
throw new NomusException(e.getMessage());
}
}[/code]
Mas assim perderíamos o benefício dos tipos genéricos. Alguém sabe como eu poderia fazer para permitir que seja passado como parâmetro apenas objetos da classe Class que implementem uma determinada interface (no caso Entidade)? Não vale checar apenas em tempo de execução, hehe!
abração, pessoal!