【问题标题】:How to ensure that a field will never be null in a Java class如何确保 Java 类中的字段永远不会为空
【发布时间】:2009-06-09 14:39:15
【问题描述】:

我正在寻找一种干净且安全的方法来确保永远不会将类的字段设置为 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

}

【问题讨论】:

    标签: java null field


    【解决方案1】:

    bar 声明为final,如下所示:

    private final Object bar;
    

    【讨论】:

      【解决方案2】:

      您正在寻找关键字 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;
         }
      }
      

      现在无法更改栏

      【讨论】:

        【解决方案3】:

        前面两个答案都是正确的,但是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,但我认为抛出异常或使用断言比静默分配新的 Object() 更好。
        【解决方案4】:

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

        private final Object foo;
        

        这有一个额外的好处,w.r.t.并发该字段保证在构造函数完成后被初始化。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-10-17
          • 1970-01-01
          • 2010-11-18
          • 2010-11-06
          • 2021-09-09
          • 1970-01-01
          • 2016-09-13
          相关资源
          最近更新 更多