Java:摆脱了复制粘贴的静态方法用法

时间:2015-03-18 10:37:46

标签: java generics inheritance static-methods

我的代码引起了我的注意。我该如何简化它?

abstract class A {}

class B extends A { //generated by Velocity
  static public Iterator<B> iterator() {...}
}

class C extends A { //generated by Velocity
  static public Iterator<C> iterator() {...}
}

用法:

for (Iterator<B> i = B.iterator(); i.hasNext();) {
  sout(i.next().toString());
}
for (Iterator<C> i = C.iterator(); i.hasNext();) {
  sout(i.next().toString());
}

有没有办法让我创建一些方法,将Class扩展A迭代它?优先不改变类生成逻辑。

2 个答案:

答案 0 :(得分:1)

首先你可以重新定义你的A类并在那里添加itterator

abstract class A<T extends A> {
    public Iterator<T> iterator() {...}
}

如果需要,这个方法是抽象的;

然后,您需要更改班级class B extends A<B>class C extends A<C>

的定义

另外,将代码复制到使用迭代器的位置,可以将其包装到方法

public   <T extends A<?>> void itterate(Iterator<T> itr) {
        for (Iterator<T> i = itr; i.hasNext();) {
            sout(i.next().toString());
        }
    }

然后你来吧

itterate(b.iterator());
itterate(c.iterator());

答案 1 :(得分:1)

绝对有可能不触及A,B和C:

public static void doSomething(Iterator<? extends A> it) {
  while (it.hasNext()) {
    sout(it.next().toString));
  }
}

然后致电:

B b = ... ; // Retrieve an instance of B
C c = ... ; // Retrieve an instance of C
doSomething(b.iterator());
doSomething(c.iterator());

记住您的编辑(iterator()成为static),您可以保留我写的方法而不会改变任何内容。然而,呼叫改变如下:

// Don't create instances anymore.
doSomething(B.iterator());
doSomething(B.iterator());