Java从内部类单例中访问外部类变量

问题描述:

我有一个接口(Node),它由两个类实现:White(我想成为单例)和Black(不是单例)。问题是我希望这些类被一个外部类(Outer)包围,该外部类具有其自己的字段(outerObject)。 White应该是单身,这意味着它应该是静态的。但Black需要能够访问外部类字段,这意味着它不能是静态的。Java从内部类单例中访问外部类变量

这里,如果White是不是静态的,那么它是不是一个真正的单身:

class Outer { 
    interface Node { 
     Node foo(); 
    } 

    // I would like the White class to be a singleton class 
    class White implements Node { 
     Node foo() { 
      return new Black(); 
     } 
    } 

    class Black implements Node { 
     Node foo() { 
      outerObject.doSomething(); 
      return this; 
     } 
    } 

    Object outerObject; 
} 

但是,如果我做White静态单身,那么就不能没有一个封闭Outer实例化一个新的Black

enum White implements Node { 
     INSTANCE; 

     Node foo() { 
      return new Black(); // This doesn't work because Black 
           // needs an enclosing outer class. 
     } 
    } 

如果我要使Black成为静态类,那么它将无法访问外部类中的字段(outerObject):

static class Black implements Node { 
     Node foo() { 
      outerObject.doSomething(); // can't access non-static field 
      return this; 
     } 
    } 

一个简单的表示,捕获了同样的问题,只是想从一个单身White访问outerObject

class Outer { 
    enum White { 
     INSTANCE; 

     Node foo() { 
      outerObject.doSomething(); 
      return this; 
     } 
    } 

    Object outerObject; 
} 

我不得不做出White非静态到能够访问outerObject,但它应该是静态的,以便成为单身人士。

有谁知道是否有解决方案吗?如果涉及到它,我可以尝试制作一个伪单体内部类(就外部类的每个实例只能有一个内部类的实例而言)。或者只是抛弃单例模式并手动声明一个White

+3

我认为你可能是过于复杂的事情。为什么你甚至需要这样的结构? – 2013-02-26 08:57:46

+0

defence除了改变你的设计,没有办法绕过这个。静态内部类不绑定到外部类的特定实例,因此它不能创建非静态内部类的实例,因为**被绑定到特定的外部实例。 – 2013-02-26 09:00:04

+0

感谢您的快速回复! 我想实现一个四叉树。 编辑:四叉树存储点和线作为内容。 '白色'节点意味着什么都没有。 '黑色'节点意味着它有一个点。还有'Grey'节点,但为了清楚起见,我将它们排除在问题之外。 – Hau 2013-02-26 09:01:42

你可以指定外部你想创建新的黑色的实例。但可能这不是你想要的。

enum White implements Node { 
     INSTANCE; 

     public Node foo() { 
      return new Outer().new Black(); // This will work 
     } 
    } 
+0

我以前见过这个,但是我需要新的'Black'与'White'包含相同的'Outer'。如果'White'是静态的,我知道这是不可能的。也许还有另外一种单例模式的非静态实现。 – Hau 2013-02-26 09:10:00