【问题标题】:Conditional Delegates in JavaJava 中的条件委托
【发布时间】:2016-08-29 21:43:39
【问题描述】:

假设存在以下类:

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 会调用 Eggs 本身而不是它的代表。混乱...

  2. One method class

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

  3. Reflection

    具有显着的性能影响,其他人难以理解。 eclipse 可能无法找到对代表的调用,这将损害可维护性。似乎是最好的选择,但对于应该有编译时解决方案的东西来说似乎很烦人。

我还找到了this,但它是在 C# 中的

【问题讨论】:

  • 为什么不让两个不同的类代表两种不同的方式,然后在代码的更高级别选择使用哪一个呢?现代 Java IDE 会自动生成委托代码,因此跟上 Foo 的变化应该不会太烦人..

标签: java delegates java-8


【解决方案1】:

如果我们可以控制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();

注意:我认为这个想法与上面qwwqwwq 在他的comments 中提出的想法很接近。

【讨论】:

  • 这是有道理的。我相信这就是我要去做的事情,即使它需要手动更新,因为它非常清楚发生了什么。如果有人要添加其他内容,我将把这个问题留得更久。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
  • 2012-03-18
相关资源
最近更新 更多