2009-06-09 8 views
5

Szukam czystego i bezpiecznego sposobu na zapewnienie, że pole klasy nigdy nie będzie ustawione na wartość null. Chciałbym, aby wartość pola została ustawiona raz w konstruktorze klasy i nigdy później nie modyfikowana. Myślę, że tylko słowo kluczowe readonly w języku C# pozwala na to. Czy jest sposób na to samo w Javie?Jak zapewnić, że pole nigdy nie będzie puste w klasie 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 

} 

Odpowiedz

16

stwierdzenie bar być final, tak:

private final Object bar; 
7

Patrzysz na finał kluczowego.

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; 
    } 
} 

Teraz bar nie może być zmieniony

6

Zarówno poprzednie odpowiedzi są poprawne, ale pBar mogą jeszcze zostać ustawione na null:

new foo(null); 

więc ostateczną odpowiedzią jest użycie końcowe słowo kluczowe i upewnij się, że pBar nie ma wartości null (jak poprzednio):

public class Foo 
{ 
    private final Object bar; 

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

+1, ale myślę, że byłoby lepiej rzucić wyjątek lub użyć assert zamiast cicho przydzielić nowy obiekt(). –

1

Chcesz zadeklarować pole jako ostateczne, np. .

private final Object foo; 

Dodatkową korzyścią jest to, że w.r.t. Współbieżność pole gwarantuje się, że zostanie zainicjowane po zakończeniu konstruktora.

Należy zauważyć, że zapobiega to tylko wymianie obiektu przez inny. Nie zapobiega modyfikacjom obiektu metodami obiektu, np. setery, w przeciwieństwie do const w C/C++.

Powiązane problemy