【问题标题】:Java prevent method duplication for same purpose - different parametersJava防止方法重复用于相同目的 - 不同的参数
【发布时间】:2017-02-05 17:56:16
【问题描述】:

我有两种几乎相同的方法。我想知道是否有办法将这两种方法组合成一种方法,这将允许我将两种类型的地图作为参数。这些方法写入一个 excel 文件。关键是 excel 标题(所有键都在第一行),映射列表是每个键下方的所有内容(数据)。有什么独特的想法吗?

private void test(Sheet sheet, HashMap<String, List<Double>> map) {
        for (String var : map.keySet()) {
            int rowNumb=0;
            Row row = sheet.getRow(rowNumb);
            Cell cell = row.createCell(currColumn);
            cell.setCellValue(var);
            rowNumb++;
            List<Double> list = map.get(var);
            for (int i = 0; i < list.size(); i++) {
                row = sheet.getRow(rowNumb);
                cell = row.createCell(currColumn);
                cell.setCellValue(list.get(i));
            }
            currColumn++;
        }
    }



private void test(Sheet sheet, HashMap<String, List<String>> map) {  <-- takes in String list rather thand Double.
        for (String var : map.keySet()) {
            int rowNumb=0;
            Row row = sheet.getRow(rowNumb);
            Cell cell = row.createCell(currColumn);
            cell.setCellValue(var);
            rowNumb++;
            List<String> list = map.get(var);         <---- Only thing that is different
            for (int i = 0; i < list.size(); i++) {
                row = sheet.getRow(rowNumb);
                cell = row.createCell(currColumn);
                cell.setCellValue(list.get(i));
            }
            currColumn++;
        }
    }

【问题讨论】:

  • 第一个想法:使用泛型。问题:currColumnrowcell 是什么 - 它们在哪里定义?
  • 废话,我在方法的前半部分取出了一些东西,以便于阅读。
  • 或许有效,或许无效,但你可以试试这个工具:pmd.github.io/pmd-5.5.2/usage/cpd-usage.html

标签: java methods code-duplication


【解决方案1】:

你应该使用泛型:

private <T> void test(Sheet sheet, HashMap<String, List<T>> map) {
    for (String var : map.keySet()) {
        List<T> list = map.get(var);
        for (int i = 0; i < list.size(); i++) {
            row = sheet.getRow(i);
            cell = row.createCell(currColumn);
            cell.setCellValue(list.get(i));
        }
        currColumn++;
    }
}

无论您以前在哪里引用 StringDouble,现在请在哪里引用 T

【讨论】:

  • 谢谢。我遇到的问题是最后一行: cell.setCellValue(list.get(i));如果它是 T 类型,setCellValue() 不知道该怎么做。除其他外,它需要 String 类型或 double 类型。这是 Apachi 软件包 POI,用于写入 excel,如果这很重要。
  • 好吧,这行得通:cell.setCellValue(list.get(i).toString()); .谢谢!
猜你喜欢
  • 2013-03-26
  • 2017-08-28
  • 1970-01-01
  • 2013-10-15
  • 2015-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多