如何在Java中检查内部类的所有权

时间:2014-07-16 12:13:20

标签: 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(/* ... */) {
        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引用(所有)外部类。

我想知道是否有更好的方法来检查这个,而不是像InnerisOwnedBy(Outer outer) { return outer == Outer.this; }那样向getOwner() { return Outer.this }添加任何方法。

2 个答案:

答案 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方法应该是私有的。