方法可以接收数组还是Iterable?

时间:2014-03-11 11:31:24

标签: java

for循环(作为foreach)接受数组或迭代,是否有一个覆盖两者的输入类型,或者我是否必须编写重载方法?我可以用Java:

public void serialize (ArrayOrIterable xxx){
  for (Object x: xxx) {
     x.doSomething()
  }
}

或者是我重复代码的唯一选择?

public void serialize (Object[] xxx){
  for (Object x: xxx) {
     x.doSomething()
  }
}

public void serialize (Iterable xxx){
  for (Object x: xxx) {
     x.doSomething()
  }
}

编写结论

更好的是,类结构实际上是一个抽象类及其实现,因此我可以在asbtract类中定义数组的行为,并且任何实现只需要覆盖一个方法。

public abstract class Serializer {

    public final void serialize(Object[] input) {
         serialize(Arrays.ssList(input));
    }

    public abstract void serialize(Iterable input);

}

2 个答案:

答案 0 :(得分:2)

遗憾的是,Java并没有合理的语法,因为Iterable和数组是离散类型。但是,您可以通过调用doSomething()来使用List接口包装数组,从而改进当前代码,从而删除Arrays.asList调用的重复:

public void serialize (Object[] xxx){
  serialize (Arrays.asList(xxx));
}

public void serialize (Iterable xxx){
  for (Object x: xxx) {
     x.doSomething()
  }
}

答案 1 :(得分:1)

您必须有两个不同的方法,因为数组不实现Iterable

但是,您仍然可以通过将数组包装为Arrays.asList()的列表来避免重复:

public void serialize (Object[] xxx){
    serialize(Arrays.asList(xxx));
}

public serialize (Iterable xxx){
    for(Object x: xxx) {
       x.doSomething()
    } 
}

这样至少你的逻辑只能用一种谨慎的方法处理。