想象一下存在以下类:
public class Foo extends Spam{
public void bar(){};
//...many more useful functions...
}
我现在需要这个:
public class Fooish extends Foo{
public static boolean whichDelegate; //true for 1, false for 2
Foo delegate1;
Foo delegate2;
}
有没有办法自动让java委托调用?
在SO上查看了许多其他回复之后,我看到了三种可能的方式,其中没有一种似乎适用于我的特定用例:
Just override everything and do the switching logic yourself
这个问题是Foo是一个变化很大的类。这样做意味着每次改变Foo时,Fooish也必须改变。
更糟糕的是,如果它没有被改变并且函数egg()被添加到Foo中,Fooish会自己调用egg而不是其代表。混乱......
我希望能够做到这一点,但是Foo是一个具体的类,并且将其功能提升到界面似乎是不可能的。我无法触及垃圾邮件。
对性能产生重大影响,并且很难让其他人理解。调用代表可能无法通过eclipse找到,这将损害可维护性。似乎是最好的选择,但对于什么应该有编译时解决方案似乎很烦人。
我还发现了this但它在C#中
答案 0 :(得分:2)
如果我们控制Foo
消费者代码,下面的模式是否合适?
public class FooDelegateSelector {
public static boolean selectDelegate1; //true for 1, false for 2
private Foo delegate1;
private Foo delegate2;
//delegates setup...
public Foo getSelectedDelegate() {
return selectDelegate1 ? delegate1 : delegate2;
}
}
消费代码 Foo
:
final FooDelegateSelector fooSelector = new FooDelegateSelector(...);
final Foo selectedFoo = fooSelector.getSelectedDelegate();
selectedFoo.bar();