簡體   English   中英

如何存儲對一個類的所有對象的引用?

[英]How to store references to all objects of a class?

假設有兩個類,ObjectA和ObjectB。 類對象A具有創建的類的對象的方法ObjectB如下:

private ObjectB createObjectB() {
    Object b = new ObjectB();
    return b;
 }

我想跟蹤ObjectB的所有實例。 有什么更好的方法可以做到這一點?

  • 在類ObjectAArrayList跟蹤所有對象。
  • ObjectB某些類變量。

每種方法的優缺點是什么? 如果我知道ObjectB對象永遠只能通過ObjectA中的一種方法創建,那會有所不同嗎?

請注意,將永遠只能是一個實例ObjectA ,但實例的數量ObjectB是可變的。

如果要從代碼的不相關部分訪問所有創建的對象,則只需要“跟蹤”以這種方式創建的對象。 否則1)創建的對象將由變量保存,因此您可以訪問它; 2)當沒有更多對該對象的引用(因此它不可訪問)時,垃圾收集器最終將清理內存。

如果您確實要跟蹤它們,請記住,當您在集合中有對象時,GC無法釋放內存,這可能導致內存不足錯誤

如果只有一個ObjectA的實例,它有一個createB方法,我會繼續在列表ObjectA 實例本身。 但實際上,我認為這並不重要。

public ObjectB createB(){
   Object B = new ObjectB();
   allBs.add(b); // assuming some sort of List
   return b;
}

我很好奇您為什么要這么做。 取決於您的應用程序及其體系結構,您可能會遇到線程問題。

在ObjectB中保存一個列表沒有任何意義,但是如果您需要引用創建的所有B對象,則在ObjectA中保留一個列表是有意義的。

這取決於您需要實現的目標。 應的實例ObjectB (這是一個不好的名字,順便說一句)能夠彼此交談? 如果是這樣,那么您將需要在類中創建一個全局變量(即static字段),或者必須將列表保留在ObjectA並將其“注入”到ObjectB每個實例中-這意味着您需要保留一個引用在兩個地方。

如果ObjectB的實例不需要互相交談,通常足以將列表保留在ObjectA

但大多數情況下,根本不需要保留列表。 這甚至可能很危險,因為您必須確保列表在消耗所有內存之前不會增長。

一般規則是:避免不必要的依賴關系。 通過保留列表,您將引入一個具有成本的依賴項(例如,在維護方面,您首先需要編寫代碼)。

提防寫的東西的成本-讓這些便宜的東西堆積成真正昂貴的依賴之類的東西很容易使您窒息,這很容易。

對我來說,看起來對象A和對象C是管理對象B實例的類。

我有一個類似的場景,我需要跟蹤不同的服務,這些服務是基本服務類的子類(在我的情況下,對象B是基本類)。

為了創建/啟動/停止/重新啟動/刪除這些服務,我有2個用於兩個不同目的的管理器類(例如您的情況下的對象A和對象C)。

在兩個經理類中,我都有一個HashMap

您可以使用一種方法來停止/啟動/創建/刪除/刪除類A或C中的B對象,該方法采用對象B的“名稱”並對對象B發起相應的操作。

並且作為最佳實踐,在SessionContextListener中,始終確保調用stop / remove操作來刪除此HashMap中添加的對象。

根據您對ObjectC的說法,我想說ObjectA(和C)維護ObjectB數組最有意義。 (實際上,如果您希望添加和減去B,我建議您使用某種Collection而不是數組)。

然后,您可以創建一個方法來返回由A創建的B的數量,例如A.countB()

如果您發現自己需要創建B的總數,並且不能使用A.countB()+ C.countB(),則有兩種選擇:B中的靜態映射,其中的鍵是創建者對象(A,C或其他對象),值是B的集合。

由於種種原因,我不建議這樣做,主要是因為創建的對象會徘徊(因此,不會出現GC,也沒有潛在的內存問題)。

另一種選擇是使用管理器類來創建和跟蹤B,並在完成實例后非常小心地取消引用。

暫無
暫無

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

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