Cuando “” == s es falso pero “” .equals (s) es verdadero
EDITAR Gracias por la pronta respuesta. Por favor, ver cuál es la verdadera pregunta. Lo he hecho audaz esta vez.
Entiendo la diferencia entre == y .equals. Entonces, esa no es mi pregunta (en realidad agregué algo de contexto para eso)
Estoy realizando la validación a continuación para cadenas vacías:
if( "" == value ) {
// is empty string
}
En elpasado al obtener valores de la base de datos o deserializar objetos de otro nodo, esta pruebaha fallado, porque las dos instancias de cadena eran, de hecho, referencias de objeto diferentes, aunque contenían los mismos datos.
Así que la solución para esas situaciones era
if( "".equals( value ) ) {
// which returns true for all the empty strings
}
Estoy bien con eso. Eso se entiende claramente.
Hoy esto sucedió una vez más, pero me desconcertó porque esta vez la aplicación es muy pequeña.aplicación independiente eso no usared en absoluto, por lo que no se obtiene una nueva cadena desde la base de datos ni se deseriza desde otro nodo.
Así que la pregunta es:
"" == value // yields false
y
"".equals( value ) // yields true
¿Para una aplicación local independiente?
Estoy bastante seguronueva cadena () no se está utilizando en el código.
Y la única forma en que una referencia de cadena podría ser "" es porque se está asignando "" directamente en el código (o eso es lo que pensé), como en:
String a = "";
String b = a;
assert "" == b ; // this is true
De alguna manera (después de leer el código más tengo una pista) se crearon dos referencias de objeto de cadena vacía diferentes, me gustaría sabercómo
Más en la línea de respuesta jjnguys:
¡Byte!
EDITAR: Conclusión
He encontrado la razón.
Después de la sugerencia de jjnguy pude ver el código con diferentes ojos.
El método culpable: StringBuilder.toString ()
Un nuevo objeto String se asigna y se inicializa para contener la secuencia de caracteres actualmente representada por este objeto.
Doh! ...
StringBuilder b = new StringBuilder("h");
b.deleteCharAt( 0 );
System.out.println( "" == b.toString() ); // prints false
Misterio resuelto.
El código utiliza StringBuilder para tratar con una cadena cada vez mayor. Resulta que en algún momento alguien lo hizo:
public void someAction( String string ) {
if( "" == string ) {
return;
}
deleteBankAccount( string );
}
y use
someAction( myBuilder.toString() ); // bug introduced.
PD. ¿He leído demasiado CodingHorror últimamente? ¿O por qué siento la necesidad de agregar algunas fotos divertidas de animales aquí?