Map<Computer, Temperature>
。现在,随着收集到的数据越来越多,并且数据结构变得更加复杂(包括计算机相互引用),我需要一个概念来处理从监视中删除计算机时会发生什么。基本上,我需要删除被删除计算机报告的所有数据。最像KISS原则的方法是手动从内存中删除数据,如:public void onRemove(Computer computer) {
temperatures.remove(computer);
// ...
}
每当我添加功能时,就必须更改这种方法 :-( 我知道Java有一个WeakHashMap
,因此我可以像这样存储报告的数据:
Map<Computer, Temperature> temperatures = new WeakHashMap<>();
每当计算机从监控中移除时,您可以调用System.gc()
以便从这些映射中及时删除所有相关数据。
第一种方法似乎有点像原始的MyISAM表,而第二种方法则类似于InnoDB表中的级联删除。但仍然感觉有点不舒服,可能是错误的方法。您能指出使用WeakHashMaps
的优缺点或提出其他解决方案吗?
onRemove
方法吗?这将有助于澄清你实际的问题是什么... - assyliasComputer
产生数据,一旦用户将它们从监视列表中移除,就必须将它们删除。 - steffenSystem.gc()
不能保证做任何事情。请参阅此错误报告http://bugs.java.com/view_bug.do?bug_id=6668279。我使用WeakHashMap来存储可能被删除的对象的元数据,以便我需要更少的维护这些映射,但是从WHM中未删除对象并不意味着任何事情。您永远无法知道GC是否已尝试收集(销毁)该对象。 - aalku