如何确保Java类中的字段永远不会为空

5

我希望找到一种干净且安全的方法,确保类的某个字段永远不会被设置为 null。我希望该字段值在类构造函数中设置一次,以后永远不再修改。我认为 C# 中的 readonly 关键字可以实现这一点。那么在 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

}
4个回答

16

像这样声明barfinal:

private final Object bar;

7
您要查找的关键字是“final”。
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);

因此,最终的解决方案是使用final关键字并确保pBar不为空(与以前一样):
public class Foo
{
   private final Object bar;

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

1
+1,但我认为最好抛出异常或使用assert而不是静默地分配一个新的Object()。 - Jason Day

1

你想将该字段声明为 final,例如:

private final Object foo;

这样做的额外好处是,就并发而言,在构造函数完成后,该字段保证已被初始化。

请注意,这仅防止将对象替换为另一个对象。与 C/C++ 中的 const 不同,它不能防止对象的方法(例如设置器)对对象进行修改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接