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 - 但它违背了我想要的。我坚持不让客户使用任何其他实现,除了我通过 FirstStrategy
或 SecondStrategy
给他的实现。有没有办法摆脱这个实现私有接口的自动完成建议,同时只公开使用匿名内部类型的有限实现?
如果您只想允许特定的子类,请为这些特定的子类提供构造函数重载:
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 中实现它,它将无法编译。而且即使客户端自己创建Strategy
class,MyObject
构造函数也不会接受。
关于这个自动完成的建议 - 这是不正确的。
我已经在 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 - 但它违背了我想要的。我坚持不让客户使用任何其他实现,除了我通过 FirstStrategy
或 SecondStrategy
给他的实现。有没有办法摆脱这个实现私有接口的自动完成建议,同时只公开使用匿名内部类型的有限实现?
如果您只想允许特定的子类,请为这些特定的子类提供构造函数重载:
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 中实现它,它将无法编译。而且即使客户端自己创建Strategy
class,MyObject
构造函数也不会接受。
关于这个自动完成的建议 - 这是不正确的。