2009-06-09 3 views
5

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

Объявить bar быть final, как это:

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

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

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, но я думаю, что было бы лучше выбросить исключение или использовать assert, а не просто назначить новый Object(). –

1

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

private final Object foo; 

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^