簡體   English   中英

在最終類的構造函數中使用“this”

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM