Frage

Wenn Sie einen Java -Code durchsehen und dies einfach nicht richtig erscheint. Für mich sieht es so aus, als ob Sie jedes Mal, wenn Sie Projekte anrufen, eine neue Hashmap erhalten, damit diese Aussage immer falsch ist

projects.get(soapFileName) != null

Es scheint, als sollte es ein Hintergrund haben

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);
            }
        }
    } ...
}
War es hilfreich?

Lösung

Nö. In Java wird diese statische Variable nur einmal initialisiert.

Diese Zeile wird also nur einmal angerufen.

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

Andere Tipps

Das Projekte Die Variable wird einmal initialisiert, wenn die Klasse zum ersten Mal lädt.

Im Allgemeinen sind statische Karten dieser Art eine schlechte Idee: Sie verwandeln sich oft in Speicherlecks, da Sie Einträge über ihre Nutzungsdauer hinaus halten.

In diesem speziellen Fall würde ich mir auch Sorgen um die Sicherheit von Thread machen. Wenn Sie über mehrere Threads verfügen, die diese Methode aufrufen (was wahrscheinlich in Code mit Webdiensten entspricht), müssen Sie den Zugriff auf die Karte synchronisieren oder sie können sie beschädigen.

Und in einem allgemeinen stilistischen Hinweis ist es eine gute Idee, Variablen mithilfe der am wenigsten restriktiven Klasse zu definieren: In diesem Fall die Schnittstelle Karte, und nicht die Betonklasse Hashmap.

Du nicht Anruf projects - Es ist ein Feld, keine Methode.

Da es sich um ein statisches Feld handelt, wird es genau einmal initialisiert (Modulo, der denselben Typ in mehreren Klassenloadern geladen wird).

Wenn Sie einen statischen Initialiser (statischer Konstruktor?) hinzufügen, können Sie feststellen, dass Statik nur initialisiert wird, wenn die Klasse zum ersten Mal geladen wird:

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

    ...
}

Sie werden nicht jedes Mal, wenn Sie eine Methode für Projekte aufrufen, eine neue Hashmap erhalten, wenn Sie sich darauf beziehen. Ein neues HashMap wird einmal erstellt, alle Instanzen der Klasse werden jedoch eine einzelne Hashmap teilen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top