【问题标题】:Java Accessing outer class variables from an inner class singletonJava从内部类单例访问外部类变量
【发布时间】:2013-02-26 08:56:15
【问题描述】:

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

这里,如果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

【问题讨论】:

  • 我认为你可能把事情复杂化了。为什么还需要这样的结构?
  • 防御除了改变你的设计之外没有其他办法。静态内部类不绑定到外部类的特定实例,因此它不能创建非静态内部类的实例,因为 绑定到特定外部实例。
  • 感谢您的快速回复!我正在尝试实现四叉树。编辑:四叉树将点和线存储为内容。 White 节点表示其中没有任何内容。 Black 节点表示其中有一个点。还有Grey 节点,但为了清楚起见,我将它们排除在外。

标签: java singleton nested


【解决方案1】:

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

    enum White implements Node {
        INSTANCE;

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

【讨论】:

  • 我以前见过这个,但我需要将新的Black 包含在与White 相同的Outer 中。我知道如果White 是静态的,这是不可能的。也许还有另一种单例模式的非静态实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-20
  • 1970-01-01
  • 2012-08-20
  • 1970-01-01
  • 2013-07-08
  • 2011-05-11
  • 1970-01-01
相关资源
最近更新 更多