2009-06-09 16 views
5

Sto cercando un modo pulito e sicuro per garantire che un campo di una classe non venga mai impostato su null. Vorrei che il valore del campo venisse impostato una volta nel costruttore della classe e non fosse mai stato modificato in seguito. Penso che la parola chiave readonly in C# lo consenta. C'è un modo per fare lo stesso in Java?Come assicurarsi che un campo non sia mai nullo in una classe 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 

} 

risposta

16

Dichiarare bar essere final, come questo:

private final Object bar; 
7

State cercando la parola chiave finale.

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

Ora bar non può essere modificato

6

Entrambe le risposte precedenti sono corrette, ma pBar potrebbero ancora essere impostato su null:

new foo(null); 

Quindi la risposta definitiva è quello di utilizzare la finale parola chiave e assicurarsi pBar non è nullo (come prima):

public class Foo 
{ 
    private final Object bar; 

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

+1, ma penso che sarebbe meglio lanciare un'eccezione o utilizzare un'asserzione piuttosto che assegnare in modo silenzioso un nuovo oggetto(). –

1

volete dichiarare il campo come finale, ad esempio, .

private final Object foo; 

Questo ha il vantaggio aggiunto che w.r.t. la concorrenza del campo è garantita per essere inizializzata dopo che il costruttore ha finito.

Si noti che questo impedisce solo la sostituzione dell'oggetto con un altro. Non impedisce modifiche all'oggetto con metodi dell'oggetto, ad es. setter, a differenza di const in C/C++.

Problemi correlati