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);
}
答案 0 :(得分:2)
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()
}
}
这样至少你的逻辑只能用一种谨慎的方法处理。