【发布时间】:2010-03-03 02:59:12
【问题描述】:
我有以下代码:
Map<String, ObjectType> objectMap = new HashMap<String, ObjectType>();
for (ObjectType obj : objects) {
obj.setSomeProperty("property value");
objectMap.put(obj.getADiffProperty(), obj);
}
似乎在循环迭代期间,某些 obj 属性针对不同的键更改,而不是当前设置的键。上面的代码有问题吗?不知何故,对 obj 的引用被 for 循环回收了?
这个循环也在外循环中。
更新:
我在下面提供完整的方法。我观察到上述行为的实际位置是在 Singleton 类中定义为 Map<String, Map<String, GlossaryTerm>> loadedTerms = new HashMap<String, Map<String, GlossaryTerm>>(); 的外部映射中。
List<Audience> audiences = ContentAccess.getAudienceList();
List<GlossaryTerm> glossaryTerms = ContentAccess.getAllReplacementCIs();
for (Audience audience : audiences) {
Map<String, GlossaryTerm> termMap = new HashMap<String, GlossaryTerm>();
for (GlossaryTerm term : glossaryTerms) {
String definition = term.getProductGlossary().get(audience.getName());
if (definition != null)
term.setDefinition(definition);
termMap.put(term.getPhrase(), term);
}
loadedTerms.put(audience.getChannelId(), termMap);
}
【问题讨论】:
-
外循环是做什么的?它会影响 sn-p 中的任何变量吗?
-
我们可以假设 setDefinition() 是一个没有副作用的简单设置器吗? getPhrase() 也一样?
-
是设置字符串的简单设置器。 getPhrase() 也一样。
-
如果可以,最好让 getAudienceList()、getAllReplacementCIs() 等返回空列表,从不为空。空检查会损害您的代码。另外, size() > 0 测试 (a) 可以替换为 isEmpty();和 (b) 可以被删除,因为 for 循环将为空列表迭代零次。
-
感谢您的建议。我实现了这些,返回了空列表。