java在复杂的、不可变的对象中初始化集合
我有一个类MyClass
的复杂对象,我的应用程序将初始化许多(数千)个。应用程序是多线程的,必须从多个线程访问这些对象
一些字段的示例如下:
final Map<String, Map<RelationSet, Set<String>>> packageRelationSetMap;
final Map<String, Set<String>> compiledUaAccessorySetMap;
为了帮助避免并发问题,我想保证MyClass
的实例是不可变的
但是,每次创建每个集合(或集合中的集合中的集合)并将其包装在Collections.unmodifiableXXX()
中都是一件痛苦的事情
我有一个想法,以集合为例,创建一个内部类MyClass.EventuallyImmutableSet implements Set
。基本上,它的工作原理与java.util.Collections.UnmodifiableCollection
类似,只是,(A)它不会是static
,(B)它不会在remove()
之类的方法中自动抛出UnsupportedOperationException
,而是首先检查MyClass
(比如immutabilityEnabled
)中的布尔变量
我的想法是,然后可以将MyClass
字段修改为
final EventuallyImmutableMap<String, Map<RelationSet, EventuallyImmutableSet<String>>> packageRelationSetMap;
final EventuallyImmutableMap<String, EventuallyImmutableSet<String>> compiledUaAccessorySetMap;
然后我可以像我在构建过程中已经做的那样构建集合,并在最后设置myClassInstance.immutabilityEnabled = true
以保证不变性(假设这些集合的所有成员本身都是不变性的,并且所有其他的不变性要求……我在这里只是问一下集合)
这是解决这个问题的合理和有效的方法吗
更新(回复评论中的问题)
why the overly nested collections?
比如说,
final Map<String, Map<RelationSet, Set<String>>> packageRelationSetMap;
外部地图中的钥匙是一个“包装代码”,它与一组附件代码相关联。顺便说一句,我确实有一个Package
类,我可以在Map
中使用它来代替它的包代码,但它仍然使字段定义:
final Map<Package, Map<RelationSet, Set<String>>> packageRelationSetMap;
。。。无论如何,稍后,在jvisualvm评测显示为性能猪的性能关键和大量使用的代码中,我需要知道,对于每个包,它与之共享公共附件的RelationSets
,以及这组公共附件是什么。(我现在每次需要的时候都会计算所有这些,而且计算时间太长了)
我欢迎重构建议作为这个问题的替代答案
共 (0) 个答案