题
浏览一些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。
不隶属于 StackOverflow