Java中的静态方法
查看一些java代码,这似乎并不正确。在我看来,每次调用projects时,都会得到一个新的hashmap,所以这个语句总是错误的Java中的静态方法,java,static-methods,Java,Static Methods,查看一些java代码,这似乎并不正确。在我看来,每次调用projects时,都会得到一个新的hashmap,所以这个语句总是错误的 projects.get(soapFileName) != null 似乎它应该有一个后盾 public static HashMap<String,WsdlProject> projects = new HashMap<String,WsdlProject>(); public Object[] argumentsFromCallSoa
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);
}
}
} ...
}
publicstatichashmap项目=newhashmap();
来自CallSoapUI的公共对象[]参数(CallT调用、向量SoapUI文件、HashMap theDDL、int messageSize)
{
试一试{
用于(字符串soapFileName:soapuiFiles){
System.out.println(“Trying”+soapFileName);
WSDLP项目;
if(projects.get(soapFileName)!=null){
project=projects.get(soapFileName);
}否则{
项目=新的WsdlProject(soapFileName);
projects.put(soapFileName,project);
}
}
} ...
}
没有。在Java中,静态变量只初始化一次
所以,这条线路只会被呼叫一次
public static HashMap<String,WsdlProject> projects = new HashMap<String,WsdlProject> ();
publicstatichashmap项目=newhashmap();
如果您所指的是一个新的HashMap,那么您不会每次在项目上调用一个方法时都得到一个新的HashMap。新的HashMap将创建一次,但是该类的所有实例将共享一个HashMap。您不调用项目
-它是一个字段,而不是一个方法
由于它是一个静态字段,因此将只初始化一次(将加载到多个类加载器中的同一类型进行模化)。当类首次加载时,projects变量将初始化一次
通常,这类静态映射是一个坏主意:它们经常会变成内存泄漏,因为您持有的条目已经超过了它们的使用寿命
在这种特殊情况下,我还担心线程安全性。如果有多个线程调用此方法(可能是在处理web服务的代码中),则需要同步对映射的访问,否则可能会损坏映射
而且,在一般的文体注释中,最好使用限制最少的类来定义变量:在本例中,是接口映射,而不是具体的类HashMap。如果添加静态初始化器(静态构造函数?),您将能够看到在第一次加载类时,静态只是初始化的:
public class Hello {
static { System.out.println("Hello static World!"); }
...
}
等等,问题又是什么?OOP,把它当作一种方法来读,因为它在方法的中间很可能是混合的,但这是一个重要的区别。它不是线程安全的。它漏了。这很难测试。根本问题是可变静态表示设计很差。是的,至少应该将实现切换到ConcurrentHashMap,但即使这样也无法解决其他潜在问题。