2013-03-18 135 views
1

我有一些自定義對象刪除對象和所有相關的對象

public static void main() 
{ 
    House h = new House(); 
} 

所以,現在我有四個目標:

  • House h
  • 屋頂r
  • 隔壁W
  • 地板表面F

屋頂r,牆w和地面f完全取決於衆議院。

所以,如果我將刪除衆議院h,我希望他們也被刪除。

什麼是正確的做法?


如果我將這個方法添加到House類:

public void remove() 
{ 
    this.r = null; 
    this.w = null; 
    this.f = null; 
} 

當我需要刪除衆議院h其所有組件寫:

public static void main() 
{ 
    h.remove(); 
    h = null; 
} 

我想這應該工作,但不確定。

另外,也許有更好的方法?

是的,有什麼關於公房,旅館等:)

+1

如果您沒有對House對象或其內容的活動引用,則所有對象都有資格進行GC調用。沒有必要將任何字段設置爲空。 – 2013-03-18 02:54:22

+2

如果沒有其他內容保持對這些內部對象的引用,那麼當'House'不再可達時它們將收集垃圾。所以你應該可以去參考房子,讓垃圾收集器爲你處理其餘的問題 – MadProgrammer 2013-03-18 02:54:24

+0

如果他們**被其他地方的**引用,該怎麼辦?但是我希望它們在刪除「父」對象的情況下被刪除。 – 2013-03-18 02:55:39

回答

-1

你已經給幾乎是正確的解決方案。一旦將對象引用標記爲空,那麼只要垃圾收集器開始運行,該對象就會被JVM垃圾收集器銷燬並從內存中移除。

您也可以在將參考變量設置爲NULL後手動指示垃圾收集器收集垃圾。

+0

只有通過任何方式無法訪問時,該對象纔會被銷燬。你不能'手動指示'垃圾收集器,你只能給它一個提示來運行。 -1。 – EJP 2013-03-18 03:05:31

1

您永遠無法依賴發生的垃圾收集。即使您致電System.gc(),您也無法保證它會做任何事情。當系統決定運行垃圾回收時,可能會收集到不可訪問的引用,但是如果運行一個小應用程序,收集器可能永遠不會運行。

如果您需要在處理對象時收到通知,則應使用java.lang.ref.PhantomReferencejava.lang.ref.ReferenceQueue。不要依靠Object.finalize()。但這似乎不是你的問題;你只是想自己清理。只有當你的應用程序的性能需要時,你才應該關心它。

0

您不需要清除House中的所有實例變量,因爲它們在沒有對House實例的引用時會自動進行垃圾回收。

如果他們從別的地方引用會怎麼樣?但是我希望它們在刪除「父」對象的情況下被刪除。

爲此,您應該使用weak references每次你從什麼地方引用House類外的對象的時間。這樣,當不再有對House的引用時,對象將被垃圾回收,因爲指向它們的唯一強引用位於House之內。