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
}

当我这样做时,NetBeans 抱怨this在构造函数中使用。好的,我明白了,在一般情况下这是一种危险的做法,因为有人可以扩展我的类,然后我会泄漏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 回答