【问题标题】:Java: Are there some tools out there which are able to refactor X[][] to List<List<X>>?Java:是否有一些工具能够将 X[][] 重构为 List<List<X>>?
【发布时间】:2010-01-29 22:32:00
【问题描述】:

我必须重构一个不小的现有项目。它包含许多数组声明和访问:
(X 不是泛型类型,它只是一个占位符)
声明:X[]X[][],
访问:someArray[i]someArray[i][j]

我必须重写所有内容才能使用通用列表:
声明:List&lt;X&gt;List&lt;List&lt;X&gt;&gt;,
访问:someList.get(i)someList.get(i).get(j)

在 Eclipse 和 Netbeans(两个最新版本)中都找不到自动化这种重构的可能性。

是否有一些工具可用于进行此类重构?

编辑:
该项目非常面向算法。不会触及算法的内部实现。但必须改变与外部世界的接触。大多数类都是以这样的方式制作的,它们只保存一些结果数组或数组数组。

【问题讨论】:

  • 如何进行简单的搜索和替换,例如使用 grep 之类的东西?
  • 查看stackoverflow.com/questions/1409432/…。我什至敢说,重构那将是一件坏事,还是你有充分的理由这样做?

标签: java arrays collections refactoring automation


【解决方案1】:

必须改变对外部世界的接触

在这种情况下,我建议不要到处更改它,而是:

  • 仅更改 public 方法的返回类型
  • 编写一个实用方法,如下所示:

    public static List<List<X>> asList(X[][] x) {
        List<X[]> list = Arrays.asList(x);
        List<List<X>> newList = new ArrayList<List<X>>(list.size());
        for (X[] xArray : list) {
            newList.add(Arrays.asList(xArray));
        }
        return list;
    }
    
  • 使用该方法更改每个public 方法的结果。即

    public List<List<X>> someAlgorithm(...) {
        // algorithm code
        X[][] result = ...;
        return Utils.asList(result); // add only this line
    }
    

【讨论】:

  • +1 虽然我可能只是重载原始方法,而不是修改现有方法。如果在一个地方你想要一个二维数组怎么办?不仅仅是改变使用它的方法。
【解决方案2】:
  1. 我很难同意你要做的事情可以称为“重构”。

  2. 数组有一些列表没有的可能性(当然反之亦然)。

例如,如果您创建一个包含 10 个整数元素的新数组,那么它的大小是 10,并且它有十个零值。

您还可以通过一些棘手的方式使用它的索引。例如,考虑基数排序算法。要使用列表实现它,您应该首先在此列表中添加很多零,这样您的性能会差两倍。

我这样说是为了解释一个想法,即几乎不可能实现强大的工具来做你想做的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多