我已经在类中实现了策略模式,以根据输入执行执行。它工作正常,并且通过简单的方式调用。
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)接口(interface)。
选择此项会导致错误的结构,建议我创建一个类Strategy
,因为它对其他类不可见。
new MyObject(null, new MyObject.Strategy() {
@Override
public void execute(Object input) {}
});
我知道匿名内部类型如何工作以及为什么会发生。这个问题很容易解决,将界面strategy
的可见性更改为public - 但这与我想要的相反。我坚持不让客户使用任何其他实现,除了我通过 FirstStrategy 或 SecondStrategy 提供给他的实现。有没有办法摆脱这种自动完成建议来实现私有(private)接口(interface),并同时使用匿名内部类型仅公开有限的实现?
最佳答案
如果您只想允许特定子类,请为这些特定子类提供构造函数重载:
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) {
// ...
}
关于Java,匿名内部私有(private)接口(interface)的可访问性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48978659/