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

4 respostas
raphaeloneves

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?

4 Respostas

Lucas_Camara

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.

M

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.

rmendes08

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;
}
raphaeloneves

Me atendeu perfeitamente. Obrigado pela explicação @Lucas_Camara e pelo complemento da resposta @rmendes08

Criado 28 de abril de 2016
Ultima resposta 29 de abr. de 2016
Respostas 4
Participantes 4