Как написать класс обслуживания для возврата любого объекта класса реализации, реализующего интерфейс

#java #spring

Вопрос:

У меня есть требование обновить количество записей в таблицу за один вызов из Java-программы. Просто это пакетное обновление JDBC.

Для этого у меня есть следующий фрагмент кода в интерфейсе и реализации, который отлично работает.

 interface TableABatchUpdater extends Logic<TableADTO> {
   void updateBatch(List<TableADTO> list)
}

class TableABatchUpdaterImpl extends AbstractLogic<TableADTO> implements TableABatchUpdater {
   @Autowired DAOClass dao;

   TableABatchUpdaterImpl(){
     super("TableA");
   }

   @Override
    void updateBatch(List<TableADTO> list) {
        dao.updateBatch(list)
    }

}
interface TableBBatchUpdater extends Logic<TableBDTO> {
   void updateBatch(List<TableBDTO> list)
}

class TableBBatchUpdaterImpl extends AbstractLogic<TableBDTO> implements TableBBatchUpdater {
   @Autowired DAOClass dao;

   TableBBatchUpdaterImpl(){
     super("TableB");
   }

   @Override
    void updateBatch(List<TableBDTO> list) {
        dao.updateBatch(list)
    }

}

interface TableCBatchUpdater extends Logic<TableCDTO> {
   void updateBatch(List<TableCDTO> list)
}

class TableACatchUpdaterImpl extends AbstractLogic<TableCDTO> implements TableABatchUpdater {
   @Autowired DAOClass dao;

   TableCBatchUpdaterImpl(){
     super("TableC");
   }

   @Override
    void updateBatch(List<TableCDTO> list) {
        dao.updateBatch(list)
    }

}


public class MyServiceClass {

  @Autowired TableABatchUpdater tableA;
  @Autowired TableBBatchUpdater tableB;
  @Autowired TableCBatchUpdater tableC;

  public void updateTables() {
     tableA.updateBatch(tableAList);
     tableB.updateBatch(tableBList);
     tableC.updateBatch(tableCList);
   }

}
 

Проблема здесь в том, что , когда я хотел бы добавить инструкции пакетного обновления для другой таблицы "TableD" , зависимости класса MyServiceClass увеличиваются, и сложность очень высока во время модульного тестирования..и т. Д. Итак, я попытался использовать один интерфейс вместо независимого интерфейса для каждой таблицы следующим образом. Но все равно мне нужно написать много классов реализации для каждой таблицы, которые мне не нужны.

 interface BatchUpdater extends Logic<?> {
       void updateBatch(List<?> list)
}
 

Я попытался написать реализации, используя заводские и составные шаблоны. Но ни одно из них не сработало.

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

 public class MyServiceClass {

    @Autowired BatchUpdaterService batchUpdaterService;

    public void updateTables() {
        batchUpdaterService.getTableUpdater("TableA").updateBatch(tableAList);
        batchUpdaterService.getTableUpdater("TableB").updateBatch(tableBList);
        batchUpdaterService.getTableUpdater("TableC").updateBatch(tableCList);
    }

}
 

Любой ответ будет высоко оценен

Комментарии:

1. Чтобы понять , существует несколько BatchUpdater реализаций , и здесь требуется программно вызвать соответствующую реализацию на основе типа списка, не так ли ? Кроме того , в рамках MyServiceClass.updateTables() того, как TableA отображается и tableAList сопоставляется bean ?

Ответ №1:

Ну, я использую фабричный шаблон с хэш-картой и отражениями для создания таких экземпляров, как

 public static class Factory{
    final static HashMap<String,Class<? extends MyAbstractClass>> supportedVersions = new HashMap<>();
    static{

        supportedVersions.put("v1", ClassV1.class);
        supportedVersions.put("v2", ClassV2.class);
        
    }

    public static MyAbstractClass getInstanceFor(String type) {
        try {
            return supportedVersions.get(type)
                    .getConstructor().newInstance("params");
        } catch (IllegalAccessException e) {
            throw new CustomException(HttpStatus.INTERNAL_SERVER_ERROR, "Something went wrong");
        } catch (InstantiationException | InvocationTargetException | NoSuchMethodException e) {
            throw new CustomException(HttpStatus.BAD_REQUEST, "Unsupported Version");

        }
    }
}