使用WeakHashMaps模拟DELETE级联

ste*_*fen 9 java dictionary

我正在开发一种监控计算机的服务.可以通过Web GUI添加或删除计算机.我将报告的数据基本保存在各种地图中Map<Computer, Temperature>.现在收集的数据增长并且数据结构变得更加复杂(包括相互引用的计算机),我需要一个概念,说明从监控中删除计算机时会发生什么.基本上我需要删除被删除的计算机报告的所有数据.最像KISS的方法是从内存中手动删除数据,比如

public void onRemove(Computer computer) {
    temperatures.remove(computer);
    // ...
}
Run Code Online (Sandbox Code Playgroud)

每当我添加功能时都必须更改此方法:-(我知道Java有WeakHashMap,所以我可以存储报告的数据,如下所示:

 Map<Computer, Temperature> temperatures = new WeakHashMap<>();
Run Code Online (Sandbox Code Playgroud)

System.gc()每当计算机从监控中移除时我都可以打电话,以便从这些地图中急切地删除所有相关数据.

虽然第一种方法看起来有点像原始的MyISAM表,但第二种方法类似于InnoDB表中的DELETE级联.但它仍然感觉有点不舒服,可能是错误的方法.你能否指出WeakHashMaps这个问题的优缺点或提出其他解决方案?

Vik*_*ren 5

不确定你的情况是否可能,但你的计算机类不能拥有所有的属性,然后有一个列表monitoredComputers(或者有一个包装类MonitoredComputers,在那里你可以包装所需的任何逻辑getTemperatures()).通过它,可以从该列表中删除它们,而不必查看所有属性列表.如果计算机是从另一台计算机引用的,那么您必须遍历该列表并从拥有它的人那里删除引用.