0

いくつかのJavaコードを調べてみると、これは正しくないようです。私には、プロジェクトを呼び出すたびに新しいハッシュマップが取得されるように見えるため、このステートメントは常にfalseです。

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);
            }
        }
    } ...
}
4

5 に答える 5

3

いいえ。Javaでは、その静的変数は1回だけ初期化されます。

したがって、この行は1回だけ呼び出されます。

public static HashMap<String,WsdlProject> projects = new HashMap<String,WsdlProject> ();
于 2009-07-01T14:16:43.307 に答える
3

プロジェクト変数は、クラスが最初にロードされるときに 1 回初期化されます。

一般に、この種の静的マップは悪い考えです。有効期限を過ぎたエントリを保持しているため、メモリ リークが発生することがよくあります。

この特定のケースでは、スレッドの安全性についても心配します。このメソッドを呼び出す複数のスレッドがある場合 (Web サービスを処理するコードにある可能性が高い)、マップへのアクセスを同期する必要があります。そうしないと、マップが破損する可能性があります。

そして、一般的な文体上の注意として、最も制約の少ないクラスを使用して変数を定義することをお勧めします。この場合、具体的なクラスHashMapではなく、インターフェースMapです。

于 2009-07-01T14:19:12.787 に答える
2

あなたは呼び出し projectsません-それはフィールドであり、メソッドではありません。

これは静的フィールドであるため、正確に 1 回初期化されます (複数のクラスローダにロードされる同じタイプを法として)。

于 2009-07-01T14:17:49.170 に答える
1

静的初期化子(静的コンストラクター?)を追加すると、クラスが最初にロードされたときに静的が初期化されたことがわかります。

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

    ...
}
于 2009-07-01T14:49:54.750 に答える
0

それが参照している場合、プロジェクトでメソッドを呼び出すたびに新しいHashMapを取得することはありません。新しいHashMapは一度作成されますが、クラスのすべてのインスタンスは単一のHashMapを共有します。

于 2009-07-01T14:16:53.540 に答える