[英]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.