0

内部ヘルパー クラスがあり、次のように、その新しいインスタンスを含むクラスのマップに追加したいと考えています。

public class SomeService {
    private final Map<Integer, ServiceTask> pendingTasksByKey;

    private class ServiceTask {
        private ServiceTask(int key) {
            // initialization...
            pendingTasksByKey.put(key, this);
        }
    }

    // the rest of the code follows
}

thisこれを行うと、NetBeansはコンストラクターでの使用について不平を言います。わかりました。誰かが私のクラスを拡張する可能性がありthis、不完全に初期化されたオブジェクトを参照してリークする可能性があるため、一般的なケースでは危険な慣行です。この警告をオフにしたくなかったので、クラスを作成できると考えましたfinal。この方法では、誰も私のクラスを拡張することはできません。したがって、thisこの時点で初期化が完了するため、 を使用するのはかなり安全です。しかし、内部クラスを としてマークしても、NetBeans は依然として警告を表示しfinalます。

私は正しいですか、それとも見逃したことがありますか?NetBeans がうるさすぎるだけですか? マルチスレッド メモリ モデルの問題の可能性以外に、そのような使用法による危険性は考えられませんthis

4

2 に答える 2

2

これは Netbeans 固有の警告です。オブジェクトがまだ構築されていないため、問題が発生する可能性があることを思い出してください。それが問題になるところで何もしていない場合は、無視してかまいません。たとえば、次のコードを見てください。

class A {
    public Object obj;

    public A() {
        B b = new B();
        b.addMe(this);

        obj = new Object();
    }
}

class B {
    ArrayList<A> list = new ArrayList<A>(0);

    public void addMe(A a) {
        list.add(a);
        System.out.println(a.obj.toString());
    }
}

このコードには問題があり、「コンストラクターでこれをリークしています」という警告を無視してはいけません。

于 2013-10-25T05:05:09.527 に答える
0

Leaking this in constructor warningには、この Netbeans 警告に関する議論があります。

pendingTasksByKeyこれらのクラスのライフサイクルのどこかに対応するものがある場合remove、私はあなたが正しいと思います.Netbeansはうるさいです.

于 2013-10-25T05:12:49.137 に答える