Java,匿名内部私有接口

时间:2018-02-25 21:29:43

标签: java eclipse interface strategy-pattern anonymous-inner-class

我已经在类中实现了策略模式,以根据输入执行执行。它工作正常,并通过一种简单的方式调用。

public class MyObject {

private final Object input;
private final Strategy strategy;

public MyObject(final Object input, final Strategy strategy) {
    this.input = input;
    this.strategy = strategy;
}

private interface Strategy {
    public void execute(final Object input);
}

public static final class FirstStrategy implements Strategy {
    @Override
    public void execute(final Object input) {...}
}

public static final class SecondStrategy implements Strategy {
    @Override 
    public void execute(final Object input) {...}
}
new MyObject(null, new MyObject.FirstStrategy());

只要我输入new MyObject(null, new MyObject,Eclipse IDE的完整助手就会让我实现私有的界面。

enter image description here

选择此项会导致错误的结构,建议我创建一个类Strategy,因为它对其他类不可见。

new MyObject(null, new MyObject.Strategy() {
    @Override
    public void execute(Object input) {}
});

我知道匿名内部类型是如何工作的以及它为什么会发生。这个很容易解决,将界面strategy的可见性更改为公开 - 但这与我想要的相反。我坚持不让客户使用任何其他实现,除了我通过FirstStrategySecondStrategy给他的实现。有没有办法摆脱这个自动完成建议来实现私有接口,并同时只使用匿名内部类型公开有限的实现?

2 个答案:

答案 0 :(得分:1)

如果只想允许特定的子类,请为这些特定的子类提供构造函数重载:

public MyObject(final Object input, final FirstStrategy strategy) {
  this(input, (Strategy) strategy);
}

public MyObject(final Object input, final SecondStrategy strategy) {
  this(input, (Strategy) strategy);
}

private MyObject(final Object input, final Strategy strategy) {
  // ...
}

答案 1 :(得分:0)

私有接口只能在MyObject类中实现。如果客户端试图在其他类中实现它,它就不会编译。即使客户创建了自己的Strategy类,MyObject构造函数也不会接受它。

关于此自动填充建议 - 它只是不正确。