我有一个单线程应用程序,它迭代一个巨大的树结构,其中子项存储在列表中.迭代器始终在不可修改的列表上运行:
public List<HierarchyNode> getChildren() {
return Collections.unmodifiableList(children);
}
Run Code Online (Sandbox Code Playgroud)
我在某个时候仍然得到一个ConcurrentModificationException,我认为在一个不可修改的List中是不可能的?迭代是使用访问者完成的...任何想法如何可能?
编辑:唯一可以修改此列表的人是持有列表的类的构造函数:
private final List<HierarchyNode> children;
Run Code Online (Sandbox Code Playgroud)
也许这与thetree的内存使用量相当大(> 4GB)的事实有关?
跟踪:
Testcase: testParserSingleFile(General.NetlistBuilder): Caused an ERROR
null
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:819)
at java.util.ArrayList$Itr.next(ArrayList.java:791)
at java.util.Collections$UnmodifiableCollection$1.next(Collections.java:1067)
at com.bevm.hierarchy.HierarchyNodeVisitorImplementation.visitArchitectureNode(HierarchyNodeVisitorImplementation.java:20)
at com.bevm.semantics.netlist.NetlistBuilder.visitArchitectureNode(NetlistBuilder.java:40)
at com.bevm.hierarchy.ArchitectureNode.accept(ArchitectureNode.java:25)
at com.bevm.hierarchy.HierarchyNodeVisitorImplementation.visitEntityNode(HierarchyNodeVisitorImplementation.java:33)
at com.bevm.semantics.netlist.NetlistBuilder.visitEntityNode(NetlistBuilder.java:33)
at com.bevm.hierarchy.EntityNode.accept(EntityNode.java:33)
at com.bevm.hierarchy.HierarchyNodeVisitorImplementation.visitComponentNode(HierarchyNodeVisitorImplementation.java:27)
at com.bevm.hierarchy.ComponentNode.accept(ComponentNode.java:25)
at com.bevm.hierarchy.HierarchyNodeVisitorImplementation.visitInstanceNode(HierarchyNodeVisitorImplementation.java:45)
at com.bevm.semantics.netlist.NetlistBuilder.visitInstanceNode(NetlistBuilder.java:85)
at com.bevm.hierarchy.InstanceNode.accept(InstanceNode.java:89)
at com.bevm.hierarchy.HierarchyNodeVisitorImplementation.visitArchitectureNode(HierarchyNodeVisitorImplementation.java:21)
at com.bevm.semantics.netlist.NetlistBuilder.visitArchitectureNode(NetlistBuilder.java:40)
at com.bevm.hierarchy.ArchitectureNode.accept(ArchitectureNode.java:25)
at com.bevm.hierarchy.HierarchyNodeVisitorImplementation.visitEntityNode(HierarchyNodeVisitorImplementation.java:33)
at com.bevm.semantics.netlist.NetlistBuilder.visitEntityNode(NetlistBuilder.java:33)
at com.bevm.hierarchy.EntityNode.accept(EntityNode.java:33)
at com.bevm.hierarchy.HierarchyNodeVisitorImplementation.visitComponentNode(HierarchyNodeVisitorImplementation.java:27)
at com.bevm.hierarchy.ComponentNode.accept(ComponentNode.java:25)
at com.bevm.hierarchy.HierarchyNodeVisitorImplementation.visitInstanceNode(HierarchyNodeVisitorImplementation.java:45)
at com.bevm.semantics.netlist.NetlistBuilder.visitInstanceNode(NetlistBuilder.java:85)
at com.bevm.hierarchy.InstanceNode.accept(InstanceNode.java:89)
at com.bevm.hierarchy.HierarchyNodeVisitorImplementation.visitArchitectureNode(HierarchyNodeVisitorImplementation.java:21)
at com.bevm.semantics.netlist.NetlistBuilder.visitArchitectureNode(NetlistBuilder.java:40)
at com.bevm.hierarchy.ArchitectureNode.accept(ArchitectureNode.java:25) …Run Code Online (Sandbox Code Playgroud) 设A是AB和AC的超类。给定一个方法:
public void handleStuff(A someObject) {
if(someObject instanceof AB){
((AB)someObject).someABFunction();
} else if(someObject instanceof AC) {
((AC)someObject).someACFunction();
}
}
Run Code Online (Sandbox Code Playgroud)
我不喜欢这里的双重检查/铸造操作;有没有其他方法可以在不首先检查类型然后进行转换的情况下进行编码?我知道我可以使用两个以 AB 或 AC 作为参数的重载函数来完成此操作,但我正在寻找更少的代码,而不是更多:-),例如:
public void handleStuff(A someObject) {
if(someObject instanceof AB){
someObject.someABFunction(); // it is already clear that this is AB
} else if(someObject instanceof AC) {
someObject.someACFunction(); // it is already clear that this is AC
}
}
Run Code Online (Sandbox Code Playgroud)