2012-02-06 81 views
2

在Java中如何遍歷特定類的每個對象,還是必須跟蹤每個對象,因爲我使用引用數組構造/銷燬並訪問對象數據?你可以遍歷Java中特定類的每個對象嗎?

+0

你正在製作你自己的'Collection'嗎? – Paul 2012-02-06 01:21:37

+1

爲什麼你想知道這個?這是一個不尋常的事情想知道,所以回答這將幫助我們回答你的問題。這聽起來像你的問題是關於某種方式*做些事情,所以如果你告訴我們你實際上是什麼*試圖做(用簡單的英語),也許我們可以提供一些更優雅的解決方案。 – Bohemian 2012-02-06 01:27:39

+0

@Bohemian我只學了四天Java,所以對我來說很簡單!我正在爲顯示在屏幕上的元素創建一個名爲'Element'的類。它們將被動態地創建,所以這個類所創建的對象的數量不會被預定義。其他幾個類將擴展這個並添加一些方法。我在想的是,每當需要重新打印窗口時,都可以依次查看每個元素對象,只有當可見屬性設置爲「true」時,纔會在屏幕上繪製該對象。 – 2012-02-06 01:38:47

回答

0

如果沒有對象的引用,它們將成爲垃圾回收的候選對象。所以,是的,你必須以某種方式跟蹤它們。你可以但不必爲此使用數組;還有Java的collections

2

在Java中,我會用aspects和切入點上一個新的對象initialization(構造函數)

此儀器不會與應用程序的正常運行干擾,你也可以打開或關閉該功能,你想要它。

大多數當前的java工具都支持方面。

1

獲得特定任意類的所有對象列表而不修改任何現有代碼的唯一方法是探索Java垃圾收集器的奇妙世界。

我不認爲你想這樣做,雖然它在理論上是可能的。更簡單的方法是讓父級構造函數在創建時跟蹤每個實例,並使用一些靜態處理程序註冊它。

但最好的方法可能是使用工廠模式,其中「工廠」類負責相關類的製造和跟蹤實例。

編輯:請注意,您不想在這樣的類中持有對該對象的強引用,否則會阻止任何對象的內存被釋放。 A WeakReference將是必要的。

+0

之前從來沒有聽說過。可能是因爲我從不需要它。很高興知道。 – UmNyobe 2012-02-06 01:46:28

1

我不認爲有辦法。問題是:什麼時候在java中釋放一個對象?虛擬機使用類似於引用計數器的東西,當它變爲0時,對象不再可用。所以虛擬機本身不能提供這樣的功能,因爲它至少需要一個對象的引用,或者從不進行垃圾收集。當你自己創建對象時,始終跟蹤一個簡單的集合是相當容易的。

+0

我相信垃圾收集器保存的引用類型稱爲* weak reference *;這使得垃圾收集器本身可以獲取對象而不會阻止它們被收集。 – Borealid 2012-02-06 01:35:52

+0

是的你是對的,但我只談論允許用戶代碼訪問對象的引用。 – UmNyobe 2012-02-06 01:41:06

0

有一些庫可以讓您導航對象圖。看看公地OGNL這裏:http://commons.apache.org/ognl/從開發者指南

報價在這裏找到:http://commons.apache.org/ognl/developer-guide.html

「OGNL作爲一種語言可以爲Java的導航通過一個簡潔的語法,允許你指定,其中可能的對象,對稱可設置和可獲得的值語言指定了一種語法,試圖提供儘可能高的抽象級別來導航對象圖;這通常意味着指定通過和到達JavaBeans屬性,集合索引等的路徑,而不是直接訪問屬性獲得者和制定者(統稱爲訪問者)。「

自從我使用它以來已經有一段時間了,但當時它是不可或缺的。

+0

OGNL不會任意訪問其執行上下文之外的對象。 OP正在問一個不同的問題。 – 2012-02-06 01:22:41

+0

這是真的,它可能無助於上下文明智(我喜歡這方面的答案,並已投票表決。) – Jubal 2012-02-06 01:30:35

0

你可以做到這一點的唯一方法就是在你想要關注的類內部保留一個靜態列表,然後在構造函數中將每個對象添加到該列表中。

您必須知道,即使您不再使用它們,垃圾收集器也不會收集任何這些對象。

0

根據這SO question它似乎並不真的有可能在Java中有效地做到這一點。這裏討論了一些相當繁重的方法,但它們略微超出了我的意思,但這個問題中的海報似乎要求類似於您所描述的內容,最後在其編輯中得出結論,它似乎並不是容易完成。

1

您可以通過將每個新實例存儲在靜態WeakHashSet中來跟蹤一個類的所有實例(也可能是一些額外的)。但我不得不同意你的設計聽起來很可疑。從更詳細的描述來看,這聽起來像窗口需要一組元素(如果它還沒有),它應該可以在屏幕上繪製它們。