2009-06-09 42 views
5

我正在尋找一種乾淨而安全的方法來確保類的字段永遠不會設置爲null。我希望字段值在類構造函數中設置一次,以後再也不會修改。我認爲他在C#中只讀關鍵字允許這樣做。有沒有辦法在Java中做同樣的事情?如何確保一個字段永遠不會在Java類中爲空

class foo 
{ 

    private Object bar; 

    public foo(Object pBar) 
    { 
    if(pBar == null) 
    { 
     bar = new Object(); 
    } 
    else 
    { 
     bar = pBar 
    } 
    } 

    // I DO NOT WANT ANYONE TO MODIFY THE VALUE OF bar OUT OF THE CONSTRUCTOR 

} 

回答

16

聲明barfinal,就像這樣:

private final Object bar; 
7

您正在尋找的關鍵字決賽。

class foo 
{ 
    private final Object bar; 

    public foo(Object pBar) 
    { 
     //Error check so that pBar is not null 
     //If it's not, set bar to pBar 
     bar = pBar; 
    } 
} 

現在巴不能改變

6

無論是以前的答案是正確的,但PBAR仍然可以被設置爲null:

new foo(null); 

所以最終的答案就是用最後的關鍵字並確保pBar不爲空(與之前一樣):

public class Foo 
{ 
    private final Object bar; 

    public Foo(Object pBar) 
    { 
     if (pBar == null) 
     { 
      bar = new Object(); 
     }else{ 
      bar = pBar; 
     } 
    } 
} 
+1

+1,但我認爲最好拋出一個異常或使用一個斷言,而不是默默地分配一個新的Object()。 – 2009-06-09 18:27:41

1

您想要將該字段聲明爲final,例如。

private final Object foo; 

這有附加的好處,w.r.t.併發性該域保證在構造函數完成後被初始化。

請注意,這隻能防止用另一個對象替換對象。它不會阻止對象的方法修改對象,例如與C/C++中的const不同。

相關問題