Java中的静态方法

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

查看一些java代码,这似乎并不正确。在我看来,每次调用projects时,都会得到一个新的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);
            }
        }
    } ...
}
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,但即使这样也无法解决其他潜在问题。