我已经在类中实现了策略模式,以根据输入执行执行。它工作正常,并通过一种简单的方式调用。
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的完整助手就会让我实现私有的界面。
选择此项会导致错误的结构,建议我创建一个类Strategy
,因为它对其他类不可见。
new MyObject(null, new MyObject.Strategy() {
@Override
public void execute(Object input) {}
});
我知道匿名内部类型是如何工作的以及它为什么会发生。这个很容易解决,将界面strategy
的可见性更改为公开 - 但这与我想要的相反。我坚持不让客户使用任何其他实现,除了我通过FirstStrategy
或SecondStrategy
给他的实现。有没有办法摆脱这个自动完成建议来实现私有接口,并同时只使用匿名内部类型公开有限的实现?
答案 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
构造函数也不会接受它。
关于此自动填充建议 - 它只是不正确。