Как убедиться, что поле никогда не будет нулевым в классе Java - PullRequest
5 голосов
/ 09 июня 2009

Я ищу чистый и безопасный способ гарантировать, что поле класса никогда не будет установлено равным нулю. Я хотел бы, чтобы значение поля было установлено один раз в конструкторе класса и никогда не изменялось позже. Я думаю, что он только для чтения ключевых слов в C # позволяет это. Есть ли способ сделать то же самое в 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 голосов
/ 09 июня 2009

Объявите bar как final, например:

private final Object bar;
7 голосов
/ 09 июня 2009

Вы ищете ключевое слово 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 голосов
/ 09 июня 2009

Оба предыдущих ответа верны, но pBar все еще можно установить в ноль:

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 голос
/ 09 июня 2009

Вы хотите объявить поле как окончательное, например,

private final Object foo;

Это имеет дополнительное преимущество, что w.r.t. параллелизм поле гарантированно будет инициализировано после завершения конструктора.

Обратите внимание, что это только предотвращает замену объекта другим. Это не предотвращает модификации объекта методами объекта, например, сеттеры, в отличие от const в C / C ++.

...