我有以下结构:
public class Outer {
public /*non-static*/ final class Inner {
// to prevent instantiating other than in method `create`
private Inner(/* ... */) { /* ... */ }
/* ... */
}
Inner create(/* ... */) {
return new Inner(/* ... */);
}
void operateOn(Inner inner) {
// TODO check if inner for this Outer instance
}
}
和这样的用法:
Outer manager = new Outer();
Inner state = manager.create(/* ... */);
和其他地方
manager.operateOn(state);
我想创建一个防呆的实用工具类,这意味着Outer.operateOn
只会接受自己拥有的Inner
实例
我知道所有非静态内部类都在其类体内通过Outer.this
引用(所有)外部类。
我想知道是否有更好的方法来检查这个,而不是像Inner
或isOwnedBy(Outer outer) { return outer == Outer.this; }
那样向getOwner() { return Outer.this }
添加任何方法。
答案 0 :(得分:7)
我想创建一个万无一失的......
总是比你想象的更难。
manager.operateOn(状态);
如果您知道与州有关联的经理,我不会提供经理。
尝试改为
state.operate();
state
知道它应该使用哪个manager
。这样就无法指定错误的经理,因为您无法更改经理。
答案 1 :(得分:0)
彼得说。
class Inner{
private Inner(Outer manager){
this.manager = manager;
}
public void operate(){
manager.operate(this);
}
}
管理员中的和operate
方法应该是私有的。