2009-06-09 81 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不同。

相关问题