2015-06-03 72 views
2

我只是想知道在將它添加到數組後,我們是否應該做obj = null請注意,這是一個特殊情況,請閱讀以下內容。我應該在arraylistist.add(obj)後做obj = null

首先,讓我們考慮A類是這樣的:

public class A { 
    public void doSomething(B object) { 
     // some code here 
    } 
} 

和類B這樣的:

public class B { 
    private final A a; 
    public B(A a) { 
     this.a = a; 
    } 
    public void aMethod() { 
     // Does something here 
     a.doSomething(this); 
    } 
} 

到現在爲止一切都OK。 B類型的對象可以調用AdoSomething()方法根據那裏的某些數據編輯對象。

現在讓我們考慮以下情況:doSomething()將對象B添加到數組列表中。現在,這要是這些代碼應該使用:

public void doSomething(B b) { 
    arrayList.add(b); 
    b = null; 
} 
// or 
public void doSomething(B b) { 
    arrayList.add(b); 
} 

在第一doSomething()我們設定的對象爲null,這意味着該方法調用者變爲零。那麼,對我來說這沒關係doSomething()電話是我需要在我的aMethod()的最後一個聲明。但是這樣做好嗎?

+5

不,方法調用者不會爲空。 Java是通過價值傳遞的。 – markspace

+1

你需要閱讀[Demeter法則](http://en.wikipedia.org/wiki/Law_of_Demeter)。 –

+2

我很困惑,你想通過設置'b = null;'來完成什麼?沒有任何情況可以做到這一點,但如果你解釋爲什麼你認爲這是一個好主意或者你認爲它做了什麼,那麼我或其他人可以幫助你瞭解爲什麼它在事情的宏偉計劃中基本上什麼都不做。 –

回答

8

只需使用:

public void doSomething(B b) { 
    arrayList.add(b); 
} 

是絕對沒有必要的參數設置爲null,因爲它(該參數,而不是它是指對象)已不存在的方法退出的時候。

重新

請注意,這是關於一個特殊的情況,請閱讀下文。

我對你的情況沒有什麼特別的。

在第一個doSomething()中,我們將對象設置爲null,這意味着方法調用者變爲null。那麼,對我來說沒問題,因爲doSomething()調用是我在aMethod()中需要的最後一個聲明。但是這樣做好嗎?

對象不能設置爲null,只有變量和參數(它們是變量)纔可以。您將引用與引用變量相混淆,這是Java中的核心區別。

+0

對象不能設置爲空。這個單獨的語句總結了Java中的「傳值」語義的一切。 +1 – CKing

+0

感謝你和@makato。我對此並不確定,因爲它不是「傳遞價值」。這是一個引用,直到你設置它的值,因爲如果你做'object.something()'它實際上修改了原來的'object'。 – Chaoz

+0

不完全。您正在修改原始對象的屬性,但與*原始對象不同。 – Makoto

5

否;它將doSomething的責任過多地混淆了。爲什麼它應該關心它插入的生命週期是什麼?

這也沒有任何效果。由於Java的被傳遞的價​​值,你只修改的b的範圍的值,而不是無論b源於。

代碼一樣,只會混淆的人讀它在路上(也許你自己),爲您描繪的行爲是一種誤導。如果你擔心你插入對象的生命週期,請注意,只要有它不會是符合垃圾收集的參考。這意味着只要您添加的收藏不符合條件,該引用也不符合條件。

相關問題