我正在开发监视计算机的服务。可以通过Web GUI将计算机添加到监视中或从监视中删除。我基本上将报告的数据保存在Map<Computer, Temperature>等各种 map 中。现在,收集的数据不断增长,数据结构变得更加复杂(包括相互引用的计算机),我需要一个概念,以了解从监视中删除计算机时会发生什么。基本上,我需要删除被删除计算机报告的所有数据。最类似于KISS的方法是从内存中手动删除数据,例如

public void onRemove(Computer computer) {
    temperatures.remove(computer);
    // ...
}

每当我添加功能时,都必须更改此方法:-(我知道Java具有 WeakHashMap ,因此我可以像这样存储报告的数据:
 Map<Computer, Temperature> temperatures = new WeakHashMap<>();

每当将计算机从监视中移出时,为了将所有关联的数据从这些映射中急切地移出,我可以调用 System.gc()

第一种方法看起来有点像原始的MyISAM表,第二种方法类似于DELETE cascades in InnoDB tables。但是仍然感觉有些不舒服,并且可能是错误的方法。您能否指出WeakHashMaps的优点或缺点或针对此问题提出其他解决方案?

最佳答案

不知道是否可能适合您的情况,但您的Computer类不能具有所有属性,然后不能包含monitoredComputers列表(或者具有一个名为MonitoredComputers的包装器类,您可以在其中包装所需的任何逻辑,例如getTemperatures())。这样就可以将它们从该列表中删除,而不必浏览所有属性列表。如果从另一台计算机引用了该计算机,则必须遍历该列表,并从拥有该列表的人中删除引用。

09-11 18:55