[RESOLVIDO] Criação de um método genérico para alterar um List<>

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 :frowning:
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