Преобразование метода в универсальный, чтобы избежать дублирования кода

#java #jpa

#java #Список #jpa #общие

Вопрос:

Мне нужна помощь в следующем: у меня есть несколько вызовов метода, которые выглядят следующим образом:

 private void saveA(myObjA myObj, List<A> myList) {
    if (myList != null amp;amp; !myList.isEmpty()) {
        myObj.saveAll(myList);
    }
}

private void saveB(myObjB myObj, List<B> myList) {
    if (myList != null amp;amp; !myList.isEmpty()) {
        myObj.saveAll(myList);
    }
}

...
  

Пример интерфейса:

 public interface myObjA
    extends JpaRepository<A, Long> {

}

public interface myObjB
    extends JpaRepository<B, Long> {

}

...
  

Дело в том, что я создаю новый для всех других вызовов (myObjB, myListB, myObjC, myListC). myObj на самом деле является интерфейсом, а второй параметр всегда является списком некоторого объекта. Есть ли какой-либо способ преобразовать этот метод в один и указать тип объекта в вызове?

Ответ №1:

Это можно сделать с помощью универсального метода:

 public <T, N> void save(JpaRepository<T, N> repo, List<T> list) {
    if (null != list amp;amp; !list.isEmpty()) {
        repo.saveAll(list);
    }
}

// usage
@Autowired
private MyRepo repository;  // MyRepo implements JpaRepository<MyObj, Long>

public void foo(List<MyObj> list) {
    save(repository, list);
}