2008-09-22 63 views
2

(Java問題)如何解決內部類的循環依賴問題?

如果我在內部類中引用一個字段,這是否會導致封閉類和內部類之間的循環依賴關係?

我該如何避免這種情況?

下面是一個例子:

public class Outer { 

    private Other o; 
    private Inner i;  

    public Outer() { 
    o = new Other(); 

    i = new Inner() { 
     public void doSomething() { 
     o.foo(); 
     } 
    }; 

    } 
} 
+0

外面,其他,內心你是說有三個班級? – jjnguy 2008-09-22 23:49:48

回答

10

靜態vs實例類:如果將內部類聲明爲靜態,那麼內部類的實例不具有對外部類的任何引用。如果它不飽和,那麼你的內部對象有效地指向創建它的外部對象(它有一個隱式引用,實際上,如果你在構造函數上使用反射,你會看到一個用於接收外部實例的額外參數)。

內部實例點外部實例:循環引用是指每個實例指向另一個實例。很多時候,您使用內部類來優雅地實現一些接口並訪問私有字段,而不實現與外部類的接口。它意味着內部實例點的外部實例,但並不意味着相反。不需要循環引用。

關閉圓:無論如何,Java中循環引用沒有任何問題。對象很好地工作,當他們沒有更多的引用,他們收集垃圾。如果他們指向對方,這並不重要。

0

您使用的示例中的語法是有點偏離不存在的類或接口內蒙古聲明。但是這個例子的概念沒有任何問題。在Java中它會正常工作。

我不知道你在這裏做什麼,但你可能要考慮可維護性更簡單的設計等

它是匿名的事件處理程序引用他們的父類的元素一個共同的模式,所以沒有理由避免它,如果是這樣的話,這就是Java的設計,而不是有功能指針。

0

(不知道這是你在問什麼......)

在運行時,內部類的外部類的實例屬於一個隱含的參考。所以,無論何時傳遞內部類實例,您也都要傳遞外部類實例。
您可以通過將內部類聲明爲「靜態」來避免這種情況,但這意味着內部類無法訪問外部類的成員變量。所以在這種情況下,如果您想訪問外部類的成員,您需要將其明確傳遞給內部類(使用setter或使用內部類的構造函數)。