Método estático em Java
-
21-08-2019 - |
Pergunta
Olhando através de algum código java e isso apenas não parece certo.Para mim, parece que cada vez que você chamar projetos, você irá obter um novo hashmap, de modo a que esta declaração é sempre falsa
projects.get(soapFileName) != null
Parece que deve ter um campo de apoio
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);
}
}
} ...
}
Solução
Não. Em Java, essa variável estática é inicializada apenas uma vez.
Então, essa linha só será chamada uma vez.
public static HashMap<String,WsdlProject> projects = new HashMap<String,WsdlProject> ();
Outras dicas
O projetos variável será inicializada uma vez, quando a classe é carregado pela primeira vez.
Geralmente, estático mapas desse tipo são uma má idéia:eles, muitas vezes, se transformar em vazamentos de memória, como você mantenha entradas passado longo da sua vida útil.
Neste caso em particular, eu gostaria de também se preocupar com a segurança do thread.Se você tiver vários segmentos chamando este método (o que é provável, no código de lidar com web services), você precisará sincronizar o acesso ao mapa ou você pode danificar a ele.
E, em geral, estilística nota, é uma boa idéia para definir as variáveis usando o menos restritivo de classe:neste caso, a interface Mapa, em vez de a classe concreta HashMap.
Você não ligar projects
- É um campo, não um método.
Como é um campo estático, ele será inicializado exatamente uma vez (Modulo o mesmo tipo que está sendo carregado em vários carregadores de classe).
Se você adicionar um inicializador estático (construtor estático?), Você poderá ver que a estática é inicializada na primeira vez em que a classe é carregada:
public class Hello {
static { System.out.println("Hello static World!"); }
...
}
Você não receberá um novo hashmap toda vez que invoca um método em projetos, se é isso que você está se referindo. Um novo hashmap será criado uma vez, no entanto, todas as instâncias da classe compartilharão um único hashmap.