声纳违规:使用keySet迭代器而不是entrySet迭代器效率低下。

3
请参考以下方法:
public Properties getProperties()
    {
        try
        {
            Properties properties = new Properties();
            loadProperties(properties);
            for (Object key : properties.keySet())
            {
                properties.setProperty((String) key, convertPropertyValue(properties.getProperty((String) key)));
            }

            // Add Config API Keys/Values
            IConfigurationManager configMgr = ConfigurationManager.getInstance();
            Map<String, Setting> settings = configMgr.getSettings();
            for (String key : settings.keySet()) {
                properties.setProperty(key, settings.get(key).getValue());
            }

            return properties;
        } catch (java.io.IOException ex)
        {
            return null;
        }
    }

当我将代码更改为检索 settings.entrySet() 而不是 settings.keySet() 时,会抛出以下错误:
<<< error: incompatible types
[ERROR] for (String key : settings.entrySet()) >>>

我能理解,由于entrySet返回的是键值对,而我们只需要键,所以会出现不兼容错误。

如何实现entrySet来修复这段代码中的Sonar违规问题?

下面是用于设置键和值的setProperty()方法:

public synchronized Object setProperty(String key, String value) {
    return put(key, value);
}

你必须创建一个 Properties 对象吗?如果这个方法创建一个 Map<String, String>,对于你代码的其余部分来说是否可以呢? - Bohemian
有人能够解决这个问题吗? -> http://stackoverflow.com/questions/32476889/sonar-violation-dodgy-write-to-static-field-from-instance-method - RVR
1个回答

7

Map.entrySet() 方法返回类型为 Set<Map.Entry>Map.Entry 用于将每个键和其关联的值组合在一起。由于可以使用传统的 for-each 循环遍历一个 Set,因此您可以像这样重写您的 for 循环:

for (Map.Entry<String, Setting> entry : settings.entrySet()) {
    properties.setProperty(entry.getKey(), entry.getValue().getValue());
}

entry.getValue() - 返回与该条目相对应的值。请问 "entry.getValue().getValue()" 会返回什么? - RVR
@Renga 在你的初始代码中,你使用了 settings.get(key).getValue()。我将 settings.get(key) 重写为 entry.getValue(),这样 settings.get(key).getValue() 就变成了 entry.getValue().getValue() - Tunaki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接