【发布时间】:2012-12-19 01:04:42
【问题描述】:
我有一个代码,其中 Set 上的 for-each 循环需要依赖于迭代器总是以相同的顺序返回元素这一事实,例如
for(ParameterObject parameter : parameters) {
/* ... */
}
HashSet 返回的迭代器不保证具有此属性,但据记载LinkedHashSet 的迭代器确实具有此属性。所以我的代码使用了LinkedHashSet,一切正常。
但是,我想知道是否可以赋予我的代码检查传递给它的集合是否符合要求。似乎这是不可能的(除了对LinkedHashSet 的直接测试)。 LinkedHashSet 没有实现我可以测试的接口,LinkedHashSet.iterator() 也没有我可以测试的接口。如果有OrderConsistentCollection或OrderConsistentIterator这样的接口就好了。
(我需要这个属性here)。
【问题讨论】:
-
不幸的是,我认为没有办法在编译或运行时检查此属性。
-
除了使用
instanceof来测试 Set 实现之外,我没有看到...但是问题是,您为什么要这样做? -
如果要保持插入条目的顺序,请使用
List。如果您想保持条目的自然顺序,请使用SortedSet。 -
您是否考虑过实现自己的接口,即使它只是一个“标记”接口(即没有方法)?
-
确实只是一个“标记”界面。我需要这个的原因如下:我的类有一个 getter,它遍历一个集合并将集合中对象的属性组合成一个属性,然后返回。它还有一个设置器,它取消组合参数,遍历集合并将子属性分配给元素。组合的顺序与问题无关,但是,为了使这项工作 getter 和 setter 必须始终使用相同的迭代顺序。
标签: java collections iterator set