如何在Java中检查内部类的所有权
我的结构如下:如何在Java中检查内部类的所有权,java,class,inner-classes,Java,Class,Inner Classes,我的结构如下: public class Outer { public /*non-static*/ final class Inner { // to prevent instantiating other than in method `create` private Inner(/* ... */) { /* ... */ } /* ... */ } Inner create(/* ... */) {
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
只接受自己拥有的internal
实例
我知道所有非静态的内部类都通过outer引用(所有)外部类。这在它们的类体内
我想知道是否有比向内部添加任何方法更好的方法,比如isOwnedBy(Outer-Outer){return-Outer==Outer.this;}
或getOwner(){return-Outer.this}
我想创造一个傻瓜证明
这总是比你想象的要难
运营经理(州)
如果你知道它必须交给与州有关的经理,我不会提供经理
试试看
state.operate();
状态
知道应该使用哪个管理器
。这样就无法指定不正确的管理器,因为您无法更改管理器。正如Peter所说
class Inner{
private Inner(Outer manager){
this.manager = manager;
}
public void operate(){
manager.operate(this);
}
}
管理器中的operate
方法应该是私有的。可能是void create(…){this.inner=new inner();}
和void operateOn(){this.inner.doSomething();}
?“这意味着Outer.operateOn只接受自己拥有的内部实例”如何传递任何其他内部类型?@assylas您可以使用create创建多个实例,它不是1:1relation@JamesB我想防止这种情况:outermanager2=newouter();内部状态2=manager2.create(…);运营经理(州2)代码>被接受的答案正是如此。嗯,我会接受这个,但是我可能在把我当前的设计翻译成一个问题时犯了一个错误。我可能会发布另一个与此类似的帖子。@Keerthivasan+1谢谢,我将把它作为一般性声明;)关键是我有一个内部类,并且管理器引用是由编译器自动生成的。彼得建议的operate
看起来像Outer.this.operate(this)
以防我的代码。注意:Outer。这是可选的。
编译器将根据参数和上下文解析正确的operate
方法。Outer需要有不同的名称,否则operate(这)代码>将无法编译。