首页 > 解决方案 > 声纳:将同步类“Hashtable”替换为非同步类,例如“HashMap”

问题描述

我无法用哈希表替换哈希表,因为我使用的方法接收哈希表:

private Context getInitialContext() throws NamingException {

        final Hashtable<String, Object> jndiProperties = new Hashtable<>();

        jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
        // This "new InitialContext()" receives a Hastable, and I can't modify that
        // because that is part of a jar
        // "javax.naming.InitialContext.InitialContext(Hashtable<?, ?> environment)
        // throws NamingException"
        context = new InitialContext(jndiProperties);

        return context;
    }

InitialContext 方法:

public InitialContext(Hashtable<?,?> environment)
        throws NamingException
    {
        if (environment != null) {
            environment = (Hashtable)environment.clone();
        }
        init(environment);
    }

我能做些什么来解决这个代码问题?

标签: javasonarqubesonarlint

解决方案


如果您必须让 SonarQube 满意并使用,请InitialContext考虑使用

Properties

请参阅: https ://docs.oracle.com/javase/8/docs/api/java/util/Properties.html

所以而不是:

final Hashtable<String, Object> jndiProperties = new Hashtable<>();

利用:

final Properties jndiProperties = new Properties();

JavaDocs 中的注释:

因为 Properties 继承自 Hashtable,所以 put 和 putAll 方法可以应用于 Properties 对象。强烈建议不要使用它们,因为它们允许调用者插入键或值不是字符串的条目。应该改用 setProperty 方法。如果在包含非字符串键或值的“受损”属性对象上调用存储或保存方法,则调用将失败。类似地,如果在包含非字符串键的“受损”属性对象上调用 propertyNames 或 list 方法,则调用将失败。

这意味着您的原始代码示例应如下所示:

    private Context getInitialContext() throws NamingException {

    final Properties jndiProperties = new Properties();

    jndiProperties.setProperty(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
    // This "new InitialContext()" receives a Hastable, and I can't modify that
    // because that is part of a jar
    // "javax.naming.InitialContext.InitialContext(Hashtable<?, ?> environment)
    // throws NamingException"
    context = new InitialContext(jndiProperties);

    return context;
}

推荐阅读