java - 如何重构这个循环?

标签 java refactoring

我有一个应用程序,其中我使用原始数组和列表来创建一个名为Item 的类。由于遗留原因,它们可以互换使用(我也希望这只是一种类型,但它就是这样)。

现在我必须添加一个像这样通过 for-each 循环工作的新方法:

public void something(Item... items) {
    for (Item i : items) {
        doStuff();
    }
}

public void something(List<Item> items) {
    for (Item i : items) {
        doStuff();
    }
}

换句话说,对于原始数组和列表,两次完全相同的方法。有什么方法可以很好地将其重构为一个方法吗?

最佳答案

不能不应该 (*) 在单一方法中执行此操作。 Item[]List<Item>是不相关的类型。

您应该让其中一个重载调用另一个:something(Item... items)来电something(List<Item>) , 或 something(List<Item>)来电something(Item... items) .

在这两个选项中,数组重载最好调用列表重载:

public void something(Item... items) {
  something(Arrays.asList(item));
}

这很便宜,因为它不复制数组,而是包装它:创建 ListO(1) .

如果要从列表重载中调用数组重载:

public void something(List<Item> items) {
  something(items.toArray(new Item[0]));
}

这会更贵,因为 toArray call 必须创建并填充一个数组:它是一个 O(n)操作,其中 n是列表的大小。但是,它有一点优势,something将无法替换 List 的内容,因为对数组的任何更新在执行后都会被丢弃。


(*) 你可以,但它真的很恶心,而且不是类型安全的,因为你必须接受 Object参数,因为没有其他常见的父类(super class)型 List<Item>Item[] ;你最终还是不得不重复这两种类型的循环;并且您必须处理(在运行时)传入完全不相关类型的可能性:

public void something(Object obj) {
  if (obj instanceof List) {
    for (Object element : (List<?>) obj) {
      Item item = (Item) element;  // Potential ClassCastException.
      doStuff();
    }
  } else if (obj instanceof Item[]) {
    for (Item item : (Item[]) obj) {
      doStuff();
    }
  } else {
    throw new IllegalArgumentException();
  }
}

真是一团糟。感谢制造商的重载。

关于java - 如何重构这个循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41897133/

相关文章:

python - 生成元素由标记分隔的字符串时避免键入冗余

python - 有没有办法重构这个? **kwarg-django

java - 如何检测 Any View 的长按位置?

java - 用 Joda-time 进行时间计算?

java - DatagramSocket.Receive 未设置端口

java - 通过用单例替换匿名类来减少内存占用。但是更需要重构设计

c# - 从类中分解所有依赖项的最简单、最快的方法

java - 在客户端-服务器应用程序中 : How to send to the DB the user's application password?

java - 在Java中,我需要读取一个文本文件并将每一行放入一个单独的数组中。但是每次我读取文本文件时我都无法分割行

c# - 使用大型 switch 语句将数据分配给属性...是否有更动态的方法来执行此操作?