Pregunta

Mirando a través de un código java y esto simplemente no parece correcto. Para mí, parece que cada vez que se llama a los proyectos, se obtiene un nuevo mapa hash, por lo que esta declaración es siempre false

projects.get(soapFileName) != null

parece que debería tener un campo respaldo

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);
            }
        }
    } ...
}
¿Fue útil?

Solución

Nop. En Java esa variable estática solamente se inicializa una vez.

Por lo tanto, esta línea se llamará solamente una vez.

public static HashMap<String,WsdlProject> projects = new HashMap<String,WsdlProject> ();

Otros consejos

proyectos variable se inicializa una vez, cuando las primeras cargas de clase.

En general, los mapas estáticos de este tipo son una mala idea: que a menudo se convierten en pérdidas de memoria, mientras mantiene las entradas mucho más allá de su vida útil

.

En este caso particular, también me preocupa la seguridad hilo. Si tiene varios hilos de llamar a este método (que es probable que en el código se trata de servicios web), necesitará para sincronizar el acceso al mapa o Podría corrupto.

Y, en una nota de estilo en general, es una buena idea para definir las variables utilizando la clase menos restrictiva: en este caso, la interfaz Mapa , en lugar de la clase concreta HashMap .

No hace llamada projects -. Es un campo, no es un método

Como se trata de un campo estático, se inicializa exactamente una vez (módulo el mismo tipo de ser cargado en múltiples cargadores de clases).

si se agrega un inicializador estático podrás ver que la estática apenas está inicializado la primera vez que se carga la clase (constructor estático?):

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

    ...
}

Usted no recibirá un nuevo HashMap cada vez que se invoca un método en proyectos, si eso es lo que usted se refiere. Un nuevo HashMap se creará una vez, sin embargo todas las instancias de la clase compartirán un único HashMap.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top