2009-08-14 7 views
39

menudo he una clase como tal:¿Debo establecer los valores de Cadena Java iniciales de nulo en ""?

public class Foo 
{ 
private String field1; 
private String field2; 

// etc etc etc 
} 

Esto hace que los valores iniciales de campo1 y campo2 iguales a null. ¿Sería mejor tener todos mis campos de clase String de la siguiente manera?

public class Foo 
{ 
private String field1 = ""; 
private String field2 = ""; 

// etc etc etc 
} 

Entonces, si soy coherente con la definición de clases, evitaría un montón de problemas con el puntero nulo. ¿Cuáles son los problemas con este enfoque?

+2

Entonces, ¿no pasará nada "malo", solo perderé mi estado de pureza de Java? – Martlark

+0

Se puede encontrar un error cuando una cadena "" inesperada se utiliza tan útilmente como una excepción planteada. Con la ventaja de que su aplicación web no falla y lo avergüenza. – Martlark

Respuesta

6

No estoy de acuerdo con los otros carteles. Usar la cadena vacía es aceptable. Prefiero usarlo siempre que sea posible.

En la gran mayoría de los casos, una Cadena nula y una Cadena vacía representan exactamente lo mismo: datos desconocidos. Ya sea que lo represente con una Cadena nula o vacía es una cuestión de elección.

+0

¿puede actualizar qué pasa si tenemos una variable de referencia que no sea una lista similar a una cadena? Debe inicializarse con algún objeto de lista para evitar NPE – Killer

+0

@Shubham, buen punto. Una colección (lista, conjunto, mapa) es un segundo caso en el que usar la versión 'vacía' en lugar de nulo a menudo tiene sentido. Personalmente prefiero (por ejemplo) una lista vacía a una referencia nula. –

48

Absolutamente no. Una cadena vacía y una cadena nula son cosas completamente diferentes y no debe confundirlas.

Para explicar con más detalle:

  • "nulo" significa "No he inicializado esta variable, o que no tiene ningún valor"
  • "cadena vacía" significa "Yo sé lo que es el valor, esta vacio".

Como ya se ha mencionado Yuliy, si estás viendo un montón de excepciones de puntero nulo, es porque usted está esperando cosas a tener valores cuando no lo hacen, o estás siendo descuidada sobre la inicialización de las cosas antes de usar ellos. En cualquier caso, debe tomarse el tiempo para programar correctamente: asegúrese de que las cosas que deberían tener valores tengan esos valores, y asegúrese de que si está accediendo a los valores de las cosas que podrían no tener valor, tenga eso en cuenta.

+0

Estoy de acuerdo; sin embargo (solo para ser un defensor del diablo) hay personas que están acostumbradas a sistemas de tipeo laxo donde pueden simplemente comenzar a usar una variable de cadena indefinida y ser tratada como vacía. –

+0

De acuerdo, pero hay razones por las que es posible que desee inicializar sus cadenas. Puede valer la pena explicar al aficionado la diferencia entre los dos. – doomspork

+4

@Chris: Pero Java no es un lenguaje débilmente tipado, así que ¿por qué siquiera molestarse con un intento a medias para que parezca uno? – Tundey

1

Evitaría hacer esto, necesita saber si sus instancias no se están llenando con los datos correctamente.

66

De esa manera yace la locura (generalmente). Si te encuentras con muchos problemas con el puntero nulo, es porque estás tratando de usarlos antes de poblarlos. Esos problemas de puntero nulo son ruidosas y desalentadoras sirenas de advertencia que te dicen dónde está ese uso, permitiéndote entonces entrar y arreglar el problema. Si inicialmente los configura para que se vacíen, entonces se arriesgarán a usarlos en lugar de lo que realmente esperaban allí.

+5

+1, pero una advertencia: si está poblando sus objetos de una base de datos, y esa base de datos pasa a ser Oracle, entonces una cadena vacía se trata como nula. Sin embargo, inicializar explícitamente en "" no lo ayudará en ese caso. – kdgregory

6

En general, sería mejor evitar esto. Un par de razones:

  1. Conseguir una NullPointerException es generalmente una buena advertencia de que está utilizando una variable antes de que debe ser, o que se olvidó de configurarlo. Establecerlo en una cadena vacía eliminaría NullPointerException, pero probablemente causaría un error diferente (y más difícil de rastrear) más adelante en su programa.

  2. Puede haber una diferencia válida entre nulo y "". Un valor nulo por lo general indica que no se estableció ningún valor o el valor es desconocido. Una cadena vacía indica que fue deliberadamente configurada para estar vacía. Dependiendo de su programa, esa sutil diferencia podría ser importante.

7

es lo que realmente tiene sentido en un caso específico para el valor que se utilizará antes de que se establece en otro lugar, y para comportarse como una cadena vacía en ese caso? es decir, ¿es una cadena vacía en realidad un valor predeterminado correcto, y tiene sentido tener un valor predeterminado?

Si la respuesta es sí, establecerlo en "" en la declaración es lo correcto. Si no, es una receta para hacer que los errores sean más difíciles de encontrar y diagnosticar.

0

De ninguna manera. ¿Por qué quieres hacer eso? Eso dará resultados incorrectos. nulls y "" "no son lo mismo.

0

Nulo es mejor, es por eso que se llaman excepciones no marcadas {excepción de puntero nulo}. Cuando se lanza la excepción, le dice que debe inicializarla a algunos no nulos . el valor antes de llamar a cualquier método en él

Si lo hace

cadena privada campo1 = "";

usted está tratando de suprimir el error es difícil encontrar el fallo, después

..
2

Yo sugeriría ninguno.

En su lugar, debe dar a sus campos valores razonables. Si no tienen que cambiar, los convertiría en definitivos.

public class Foo { 
    private final String field1; 
    private final String field2; 
    public Foo(String field1, String field2) { 
     this.field1 = field1; 
     this.field2 = field2; 
    } 
    // etc. 
} 

No hay necesidad de asignar, estoy-no-inicializado aún valores. Solo dale los valores iniciales.

2

Sé que esto es una cuestión de edad, sino que quería señalar lo siguiente:

String s = null; 

    s += "hello"; 
    System.out.println(s);// this will return nullhello 

mientras que

String s = ""; 

    s += "hello"; 
    System.out.println(s); // this will return hello 

, obviamente, la realidad respuesta a esto es que uno debe usar StringBuffer en lugar de sólo Concatenar cadenas, pero como todos sabemos, para algunos códigos es más simple de concatenar.

+5

¿Cuál es la diferencia? Lucen iguales para mi. – Martlark

1

Creo que cuando uses String s = null creará la variable "s" solo en la pila y no existirá ningún objeto en el montón, pero tan pronto como declares las cosas como "String s =" "; lo que hará es como creará "" objeto en montón. Como sabemos que las cadenas son inmutables, cada vez que asigne un nuevo valor a la varible de cadena cada vez creará un nuevo objeto en el montón ... Así que creo que String s = null es eficiente que String s = "";

¡Sugerencias son bienvenidas!

+0

No, como String es inmutable, Java es lo suficientemente inteligente como para crear solo el objeto "" una vez y simplemente devolver otra referencia al mismo – jasg

Cuestiones relacionadas