spring 概括了三种不同的服务实现所使用的方法,并使用泛型

6tqwzwtp  于 2022-10-30  发布在  Spring
关注(0)|答案(1)|浏览(144)

下面的方法被三个不同的服务所使用,并且在将来可能其他的实现也会被同样的使用,目前的方法不是集中的,它是锅炉板的,因为它存在于每个服务实现中。我正在寻找一种方法,使它集中使用泛型或任何其他建议的解决方案。

public void persistImageDetailsV2() {
        String bucketKey = null;
        String modelCode = null;
        List<S3Object> objList = new ArrayList<>();
        String bucketName = s3BucketDetails.getBucketName();
        String bucketPath = s3BucketDetails.getMsilBucketPrefix();
        log.info("[{}]:Intializing the required attributes: Bucket name [{}] and Bucket path [{}] ", appName,
                bucketName, bucketPath);
        try {
            fillMap();
            List<ModelCode> modelCodes = layoutRepository.findDistinctAllBy();
            List<String> modelCodePresent = modelCodes.stream().map(ModelCode::getModelCode)
                    .collect(Collectors.toList());
            List<CommonPrefix> allKeysInDesiredBucket = listAllKeysInsideBucket(bucketName, bucketPath);
            List<String> s3ModelCodes = allKeysInDesiredBucket.stream().map(CommonPrefix::prefix)
                    .map(s -> new File(s).getName()).collect(Collectors.toList());
            if (!AppUtil.listEqualsIgnoreOrder(s3ModelCodes, modelCodePresent)) {
                synchDB(s3ModelCodes, s3ModelCodes);
            }
            if (null != allKeysInDesiredBucket && !allKeysInDesiredBucket.isEmpty()) {
                for (CommonPrefix commonPrefix : allKeysInDesiredBucket) {
                    bucketKey = commonPrefix.prefix();
                    modelCode = new File(bucketKey).getName();
                    if (modelCodePresent.contains(modelCode)) {
                        log.info("[{}]: Model code [{}] found,skipping iteration", appName, modelCode);
                        continue;
                    }
                    objList = s3Service.getBucketObjects(bucketName, bucketKey);
                    if (null != objList && !objList.isEmpty()) {
                        for (S3Object object : AppUtil.skipFirst(objList)) {
                            Integer overlayId = overlayMasterMap.get(AppUtil.removeExtension(object.key()));
                            saveLayout(bucketName, object.key(), modelCode, overlayId);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("[{}]: Exception occurred while processing: error is: {}", appName, e.getMessage());
            e.printStackTrace();
        }

    }

在本例中,layoutRepository的片段List<ModelCode> modelCodes = layoutRepository.findDistinctAllBy();ServiceA,以类似的方式,它可以是ServiceB或ServiceC的示例,等等。
所以我正在寻找一种方法,我可以隔离和克服这种紧密耦合的东西形成的代码。
请帮帮忙

qaxu7uf2

qaxu7uf21#

那么所有实现之间的唯一区别是List<ModelCode> modelCodes = layoutRepository.findDistinctAllBy()吗?
如果是,那么ModelCode在所有实现中是否都是相同的?如果是,你可以简单地用Supplier<List<ModelCode>>参数化这个方法,然后把它作为某种可以重用的公共函数:

public void persistImageDetailsV2(Supplier<List<ModelCode>> modelCodeLoader) {
           ....
        try {
            fillMap();
            List<ModelCode> modelCodes = modelCodeLoader.get();
            List<String> modelCodePresent = modelCodes.stream().map(ModelCode::getModelCode)
                    .collect(Collectors.toList());
            ....
        } catch (Exception e) {
            log.error("[{}]: Exception occurred while processing: error is: {}", appName, e.getMessage());
            e.printStackTrace();
        }
}

那么所有的实现都只是通过调用这个公共方法:

persistImageDetailsV2(()->layoutRepository.findDistinctAllBy());
persistImageDetailsV2(()->anotherLayoutRepository.findDistinctAllBy());

如果ModelCode在所有实现中不相同,则首先从它们中提取一个接口,如下所示:

interface IModelCode {
   String getModelCode();
}

并使所有ModeCode实现都实现这个接口,上面常用的方法就会变成:

public <T extends IModelCode> void persistImageDetailsV2(Supplier<List<T>> modelCodeLoader) {
           ....
        try {
            fillMap();
            List<T> modelCodes = modelCodeLoader.get();
            List<String> modelCodePresent = modelCodes.stream().map(IModelCode::getModelCode)
                    .collect(Collectors.toList());
            ....
        } catch (Exception e) {
            log.error("[{}]: Exception occurred while processing: error is: {}", appName, e.getMessage());
            e.printStackTrace();
        }
}

相关问题