Java,匿名内部私有接口的可访问性

Java, accessibility of anonymous inner private interface

我已经在 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 的完整助手就会让我实现 private 的接口。

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

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

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

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

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) {
  // ...
}

私有接口只能在 MyObject class 中实现。如果客户端试图在其他 class 中实现它,它将无法编译。而且即使客户端自己创建Strategyclass,MyObject构造函数也不会接受。

关于这个自动完成的建议 - 这是不正确的。