浏览一些Java代码,这似乎不正确。对我来说,看起来每次调用项目时,您都会得到一个新的hashmap,因此此语句始终是错误的

projects.get(soapFileName) != null

好像应该有一个支持领域

public static HashMap<String,WsdlProject> projects = new HashMap<String,WsdlProject>();

public Object[] argumentsFromCallSoapui(CallT call, Vector<String> soapuiFiles, HashMap theDPLs,int messageSize)
{
    try {
        for (String soapFileName:soapuiFiles){
            System.out.println("Trying "+soapFileName);
            WsdlProject project ;
            if (projects.get(soapFileName) != null){
                project = projects.get(soapFileName);
            } else {
                project = new WsdlProject(soapFileName);
                projects.put(soapFileName,project);
            }
        }
    } ...
}
有帮助吗?

解决方案

没有。在Java中,静态变量只能初始化一次。

因此,这条线只会被调用一次。

public static HashMap<String,WsdlProject> projects = new HashMap<String,WsdlProject> ();

其他提示

项目 当类首次加载时,变量将初始化一次。

通常,这类静态地图是一个坏主意:当您将条目持续很长时间时,它们通常会变成记忆泄漏。

在这种特殊情况下,我还会担心线程安全。如果您有多个呼叫此方法的线程(这可能是在处理Web服务的代码中),则需要同步对地图的访问,否则可能会损坏它。

而且,从一般的风格上说,最好使用最少限制类定义变量:在这种情况下,接口 地图, ,而不是混凝土班 哈希图.

你没有 称呼 projects - 这是一个字段,而不是方法。

由于它是一个静态字段,因此将精确初始化一次(Modulo在多个classloaders中加载相同的类型)。

如果添加静态启动器(静态构造函数?),您将可以看到静态仅在第一次加载时才初始化:

public class Hello {
    static { System.out.println("Hello static World!"); }

    ...
}

如果您是指的话,您将不会在项目上调用一个方法时获得新的哈希图。将创建一个新的hashmap,但是类的所有实例都将共享一个单个hashmap。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top