我正在实现复合设计模式,我注意到我有很多带有代码重复的遍历。
例如:
class Composite extends BaseComposite{
LinkedList<BaseComposite> objs;
public BaseComposite foo(int id){
for(BaseComposite obj : objs){
if(obj.getId() == id){
return obj;
}
BaseComposite tmp = obj.foo(id);
if(tmp != null){
return tmp;
}
}
return null;
}
public BaseComposite bar(int id){
for(BaseComposite obj : objs){
if(obj.getId() == id){
return obj;
}
BaseComposite tmp = obj.bar(id);
if(tmp != null){
return tmp;
}
}
return null;
}
}
class Leaf extends BaseComposite{
public BaseComposite foo(int id){
if(this.id == id){
return this;
}
return null;
}
public BaseComposite bar(int id){
return null;
}
}
有没有办法防止 Composite 类中的代码重复?有没有办法拥有一个虚拟方法的“回调”?
我更喜欢避免反射(reflection)。
最佳答案
在 Java 8 中,您可以仅传递一个递归方法并传递一个函数作为第二个参数。然后您将传递 this::foo
或 this::bar
作为参数。大致思路是这样的:
public BaseComposite traverse(BiFunction<Integer, BaseComposite, BaseComposite> f, int id){
for(BaseComposite obj : objs){
if(obj.getId() == id){
return obj;
}
BaseComposite tmp = f.apply(obj, id);
if(tmp != null){
return tmp;
}
}
return null;
}
public BaseComposite foo(int id){
return traverse(this::foo, id);
}
public BaseComposite bar(int id){
return traverse(this::bar, id);
}
关于java - 递归回调虚拟方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49034744/