Java中的条件代理

时间:2016-08-29 21:43:39

标签: java delegates java-8

想象一下存在以下类:

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上查看了许多其他回复之后,我看到了三种可能的方式,其中没有一种似乎适用于我的特定用例:

  1. Just override everything and do the switching logic yourself

    这个问题是Foo是一个变化很大的类。这样做意味着每次改变Foo时,Fooish也必须改变。

    更糟糕的是,如果它没有被改变并且函数egg()被添加到Foo中,Fooish会自己调用egg而不是其代表。混乱......

  2. One method class

    我希望能够做到这一点,但是Foo是一个具体的类,并且将其功能提升到界面似乎是不可能的。我无法触及垃圾邮件。

  3. Reflection

    对性能产生重大影响,并且很难让其他人理解。调用代表可能无法通过eclipse找到,这将损害可维护性。似乎是最好的选择,但对于什么应该有编译时解决方案似乎很烦人。

  4. 我还发现了this但它在C#中

1 个答案:

答案 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();

注意:我认为这个想法与qwwqwwqcomments上面提出的建议很接近。