簡體   English   中英

Java從內部類單例訪問外部類變量

[英]Java Accessing outer class variables from an inner class singleton

我有一個由兩個類實現的接口( 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

您可以指定要創建新Black的外部實例。 但這可能不是您想要的。

    enum White implements Node {
        INSTANCE;

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM