2013-10-25 22 views
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應該是非常安全的,因爲此時初始化已完成。但是,即使我將內部類標記爲final,NetBeans仍會顯示警告。

我是對的還是有我錯過的東西?它只是NetBeans太挑剔了嗎?除了可能的多線程內存模型問題之外,我想不出任何這種this用法的危險。

+1

Eclipse中沒有警告。對我來說看起來很好。 –

回答

0

Leaking this in constructor warning討論了這個Netbeans警告。

如果pendingTasksByKey有相應的remove在這些類的生命週期的某個地方,我會說你是對的,Netbeans是挑剔的。

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()); 
    } 
} 

此代碼有一個問題,我不應該忽略「泄漏這在構造函數」警告。

+0

在這個例子中很清楚。它甚至不需要警告。我認爲這個警告是爲了提醒可能的子類化,所以即使你在構造函數的最後一個語句中泄漏了這個元素,該對象仍然不能完全初始化。但是在最後一堂課上不應該有這樣的問題。 NetBeans可以檢查所有字段是否由您泄漏「this」的位置進行初始化,並且只有在不存在時纔會發出警告。 –

+0

@SergeyTachenov是的,這不是爲什麼這可能是一個問題的最好的例子。這只是使用這個結果導致拋出異常的一個例子。我確定可能有更好的例子。這是我認爲這在視覺上很明顯的第一個。 – Radiodef