[英]Using “this” in the constructor of a final class
我有一个内部帮助器类,我想将它的每个新实例添加到包含类的地图中,如下所示:
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
,作为初始化完成,因为这一点。 但即使我将内部类标记为final
NetBeans仍会显示警告。
我是对的还是我错过了什么? 它只是NetBeans过于挑剔吗? 除了可能的多线程内存模型问题,我想不出this
用法的任何危险。
这是一个特定于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());
}
}
这段代码有问题,我不应该忽略“在构造函数中泄漏”警告。
在构造函数警告中泄漏此问题已讨论此Netbeans警告。
如果pendingTasksByKey
在这些类的生命周期中的某个地方有相应的remove
,我会说你是对的,Netbeans很挑剔。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.