【问题标题】:Java join duplicate methodsJava join 重复方法
【发布时间】:2021-09-17 05:34:06
【问题描述】:

我有两种服务方法,除了实体和可运行类型之外,它们几乎相同。

有没有办法加入他们?

我认为泛型可能会有所帮助,但不知道如何在此处应用它们

public class PoliceService {
    private static final int API_REQUEST_PER_SEC = 15;
    private static final ExecutorService apiExecutor = Executors.newFixedThreadPool(API_REQUEST_PER_SEC); 

 public void downloadAllCrimesInDateRange(Map<String, String> map) {
        // Duplicate variables from map here

        List<Station> list = new ArrayList<>();
        CsvParser.getLinesFromCsvFile(file)
                 .forEach(strings -> list.add(new Station(strings[0], strings[2], strings[1])));

        for (int i = 0; i <= months; i++) {
            LinkedBlockingQueue<Station> queue = new LinkedBlockingQueue<>(list);

            for (int j = 0; j < queue.size(); j++) {
                apiExecutor.submit(new CrimeTask(queue.remove(),
                        from.plusMonths(i),
                        writeFile));
            }
        }
    }

    public void downloadStopAndSearch(Map<String, String> map) {
        // Duplicate variables from map here

        List<Force> list = new ArrayList<>();
        CsvParser.getLinesFromCsvFile(file)
                 .forEach(strings -> list.add(new Force(strings[0], strings[1])));

        for (int i = 0; i <= months; i++) {
            LinkedBlockingQueue<Force> queue = new LinkedBlockingQueue<>(list);
            
            for (int j = 0; j < queue.size(); j++) {
                apiExecutor.submit(new StopSearchTask(queue.remove(),
                        from.plusMonths(i),
                        writeFile));
            }
        }
    }
}

【问题讨论】:

  • StationForce是什么关系?
  • @Simone Lugarella 无。如果有帮助,我可以从一些 BaseEntity 扩展它们
  • StopSearchTaskCrimeTask 相同

标签: java dry code-duplication


【解决方案1】:

这是我发现的最好的方法。如果你真的想这样做,这是一种方式,但我不推荐它。

你最终会拥有这些方法:

public void downloadAllCrimesInDateRange(Map<String, String> map) {

    newMethod(map, TypeEnum.STATION);
}
   
public void downloadStopAndSearch(Map<String, String> map) {

    newMethod(map, TypeEnum.FORCE);
}
        
public void newMethod(Map<String, String> map, TypeEnum type) {

    List<BaseClass> list = new ArrayList<>();
        
    switch (type) {
    case FORCE:
        CsvParser.getLinesFromCsvFile(file)
                .forEach(strings -> list.add(new Force(strings[0], strings[1])));
        break;

    case STATION:
        CsvParser.getLinesFromCsvFile(file)
            .forEach(strings -> list.add(new Station(strings[0], strings[2], strings[1])));
        break;
    }
        

    for (int i = 0; i <= months; i++) {
        LinkedBlockingQueue<BaseClass> queue = new LinkedBlockingQueue<>(list);
            
        for (int j = 0; j < queue.size(); j++) {
            switch (type) {
            case FORCE:
                apiExecutor.submit(new StopSearchTask(queue.remove(),
                        from.plusMonths(i), writeFile));
                break;

            case STATION:
                apiExecutor.submit(new CrimeTask(queue.remove(),
                        from.plusMonths(i), writeFile));
                break;
                
            }
        }
        
    }
}   

这需要为StopSearchTaskCrimeTask 创建一个父类:

public class BaseTask { }
    
public class StopSearchTask extends BaseTask { }
    
public class CrimeTask extends BaseTask { }

还有 ForceStation 的父类:

public class BaseClass { }
    
public class Station extends BaseClass { }
    
public class Force extends BaseClass { }

还有一个 Enum 来处理这两种类型。

public static enum TypeEnum {
        STATION ,
        FORCE;
}

【讨论】:

  • 是的,看起来不太好)无论如何感谢您的努力。我可能需要做一些重大的重构
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-12
  • 1970-01-01
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多