2009-06-09 14 views
5

Estoy buscando una manera limpia y segura de garantizar que un campo de una clase nunca se establezca como nulo. Me gustaría que el valor del campo se establezca una vez en el constructor de la clase y nunca más se modifique. Creo que la palabra clave readonly en C# lo permite. ¿Hay alguna manera de hacer lo mismo en Java?Cómo asegurar que un campo nunca será nulo en una clase de 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 

} 

Respuesta

16

Declarar bar ser final, así:

private final Object bar; 
7

Usted está buscando la última palabra.

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

Ahora bar no se puede cambiar

6

Tanto las respuestas anteriores son correctas, pero pBar todavía podrían establecerse a null:

new foo(null); 

Así que la respuesta final es utilizar la final palabra clave y asegúrese de que pBar no sea nulo (como antes):

public class Foo 
{ 
    private final Object bar; 

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

+1, pero creo que sería mejor lanzar una excepción o usar una afirmación en lugar de asignar silenciosamente un nuevo objeto(). –

1

Quiere declarar el campo como final, por ejemplo .

private final Object foo; 

Esto tiene la ventaja añadida de que w.r.t. concurrencia, se garantiza que el campo se inicializará después de que el constructor haya finalizado.

Tenga en cuenta que esto solo impide reemplazar el objeto por otro. No impide modificaciones al objeto por los métodos del objeto, p. setters, a diferencia de const en C/C++.

Cuestiones relacionadas