Boa tarde, meus caros.
Nunca trabalhei na prática com criação de métodos genéricos, mas hoje possuo uma situação em que devo pegar algumas listas que estão dentro de um objeto e settar os ids dos respectivos objetos da lista para null.
Primeiramente seguem as listas do meu objeto imóvel:
private List<Benfeitoria> benfeitorias;
private List<Imagem> imagens;
No cenário onde meu objeto vem com esses dados preenchidos, preciso settar o ID dos mesmos para null. Criei um método intermediário para retornar o imóvel novo com as listas contendo objetos com id null.
public Imovel generateNewImovel(Imovel imovel){
if(imovel.getBenfeitorias() != null) imovel.setBenfeitorias(resetIds(imovel.getBenfeitorias()));
if(imovel.geImagens() != null) imovel.setImagens(resetIds(imovel.getImagens()));
return imovel;
}
Aqui entra a verdadeira dificuldade: criar o abençoado do método.
private <T> List<T> resetIds(List<T> lista){
List<T> objs = new ArrayList<T>();
for(Object item : lista){
item.setId(null);
objs.add((T) item);
}
return objs;
}
Mas nada feito
Alguém pode dar um help?
Você deve abstrair o reset desses ID’s. Para isso, recomendo a criação de uma interface, ex.:
public interface IdResettable {
void resetId();
}
Com essa interface criada, faça as classes que deverão ter o id resetado implementar essa interface e, consequentemente, implementar o método resetId
, ex.:
public class Benfeitoria implements IdResettable {
private Integer id;
// implemente o método resetId fazendo o reset de acordo com o atributo da classe
public void resetId() {
this.id = null;
}
}
Depois, altere o método genérico para:
private <T> List<T> resetIds(List<T> lista){
List<T> objs = new ArrayList<T>();
for(IdResettable item : lista){
item.resetId();
objs.add((T) item);
}
return objs;
}
Não testei o código, mas a ideia é essa. Abstrair o reset do id, mantendo a implementação do reset em sua respectiva classe.
2 curtidas
Além da sugestão do lucastody vc também pode usar o design pattern reflection, para procurar por um método no seu objeto e lançar o parametro que esse método espera. Caso voce não queira alterar suas classes de dominio implementando uma interface.
Ou percorra essa lista, verifica qual a classe que o objeto pertence com instanceof e faça o cast para determinada classe, daí pra frente vc utiliza os métodos da classe como quiser. Boa sorte.
Só complementando, o método genérico deve usar extends :
private <T> List<T extends IdResettable > resetIds(List<T extends IdResettable > lista){
List<T> objs = new ArrayList<T>();
for(IdResettable item : lista){
item.resetId();
objs.add((T) item);
}
return objs;
}
1 curtida
Me atendeu perfeitamente. Obrigado pela explicação @Lucas_Camara e pelo complemento da resposta @rmendes08