0

浏览一些 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);
            }
        }
    } ...
}
4

5 回答 5

3

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

所以,这条线只会被调用一次。

public static HashMap<String,WsdlProject> projects = new HashMap<String,WsdlProject> ();
于 2009-07-01T14:16:43.307 回答
3

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

一般来说,这种静态映射是一个坏主意:它们经常变成内存泄漏,因为你持有的条目已经过了它们的使用寿命。

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

而且,在一般的风格说明中,使用限制最少的类来定义变量是个好主意:在这种情况下,接口Map,而不是具体的类HashMap

于 2009-07-01T14:19:12.787 回答
2

你不打电话 projects- 这是一个领域,而不是一种方法。

由于它是一个静态字段,它将被初始化一次(模数相同的类型被加载到多个类加载器中)。

于 2009-07-01T14:17:49.170 回答
1

如果您添加一个静态初始化程序(静态构造函数?),您将能够看到在第一次加载类时才初始化静态变量:

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

    ...
}
于 2009-07-01T14:49:54.750 回答
0

每次在项目上调用方法时,您都不会得到一个新的 HashMap,如果这就是您所指的。一个新的 HashMap 将被创建一次,但是该类的所有实例将共享一个 HashMap。

于 2009-07-01T14:16:53.540 回答