5

我正在寻找一种干净且安全的方法来确保一个类的字段永远不会被设置为空。我希望在类构造函数中设置一次字段值,以后不再修改。我认为他在 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

4 回答 4

16

声明barfinal,像这样:

private final Object bar;
于 2009-06-09T14:40:44.020 回答
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;
   }
}

现在无法更改栏

于 2009-06-09T14:40:45.550 回答
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;
        }
     }
 }
于 2009-06-09T14:45:33.057 回答
1

您想将该字段声明为最终字段,例如

private final Object foo;

这具有额外的好处,即保证在构造函数完成后初始化字段的并发性。

请注意,这只会防止将对象替换为另一个对象。与 C/C++ 中的 const 不同,它不会阻止通过对象的方法(例如 setter)对对象进行修改。

于 2009-06-09T14:45:53.197 回答