Pregunta

Así que he comprado el libro "Java para los maniquíes" 4ª edición, y debo decir que es probablemente el mejor 30 dólares que he pasado en un libro. No soy nuevo en la codificación, soy en realidad bastante decente en por lo que si lo digo yo.

Sin embargo, me he encontrado con una línea de código que me tiene un toque confundido:

public void setName(String n)
{
     if(!n.equals(""))
     {
          name = n;
     }
}

Mi pregunta surge en la tercera línea, la parte si ... Sé cómo funcionan si bucles (es decir: si (esto == eso) {hacer cosas}) (n.equals ( "")!), pero yo no he visto el! n.equals ( ""), creado antes. Puede alguien por favor que me lo explique?

PD: Sólo para tirar en una conjetura. ¿Es lo mismo que:

public void setName(String n)
{
     if(n != "")
     {
          name = n
     }
}

Creo que es simplemente una manera de asegurarse de que si el usuario no escribe un nombre (es decir myAccount.setName = "";.) No relajarse un error y se ejecuta de manera normal, pero yo no estaba 't seguro.

Gracias de antemano por la ayuda!

EDIT: cambiado de "myAccount.name = "";" a "myAccount.setName = "";"., lo de la confusión

GRACIAS: Va a Asaf, apreciar la respuesta! Igual a Lucas Aardvark, respondió así, pero Asaf respondió mi comentario de verificación en su propia respuesta en primer lugar, gracias a todos!

¿Fue útil?

Solución

if(!n.equals(""))
{
     name = n;
}

significa que si n no es una cadena vacía, asignar su valor a nombre.

En Java, cada objeto tiene un método equals (Object o) para comprobar la igualdad con otro objeto. El operador == se suele utilizar para comparar primitivas. También se puede utilizar para comparar los objetos de "identidad". es decir. los dos objetos son, de hecho, la misma instancia. Esto es muy útil para los tipos inmutables, tales como cadenas y todos los envoltorios de objeto para los tipos primitivos como enteros y Long.

Otros consejos

En Java, las cadenas son inmutables, pero no internados, por lo  si ( "" == n) puede o no ser cierto para otra cadena para los que "" .equals (n) es verdadera.

Sólo para confundir más, esto es mal código, se consigue una NullPointerException Si se llama con null como el argumento. Debe ser escrito como "" .equals (n)

Los equals () método compara contenidos de las dos cadenas. El == y! = Operadores le indican si los dos objetos String son el mismo objeto o no. Dos cadenas diferentes con el mismo contenido, y por tanto iguales () entre sí, pueden estar todavía! = El uno al otro. A pesar de que Las cadenas no son mutables, que ayuda a entender la diferencia imaginando que las cadenas son mutables, y luego es igual a () significa "Actualmente la misma" y == significa "siempre será la misma".

La regla segura es utilizar siempre iguales () a menos que esté seguro de ambas cadenas son internado . Citando:

  

De ello se desprende que para dos cuerdas s   y t, s.intern () == t.intern () es   verdadero si y sólo si s.equals (t) es   verdadera.

     

Todas las cadenas literales y la cadena de valor   expresiones constantes internadas.

Considere esto:

String a="";
String b="";

Tanto a como b son objetos de cadena, cada uno con su propia asignación de memoria y por lo tanto una dirección única. a y b se encuentran en diferentes direcciones. Cuando se codifican la expresión lógica

a == b

que está comparando las direcciones de los objetos, no su contenido. Para comparar la contenidos que deben utilizar los iguales del objeto String () método.

Un objeto tiene una ubicación física en la memoria, que es único para cada objeto - no hay dos objetos distintos pueden tener la misma dirección de memoria - y su contenido o valor. El operador == compara las direcciones de los objetos; cuando se codifican a == b está preguntando si a y b son los nombres de alias para el mismo objeto - hacer A y B se refieren a la misma ubicación física. a.equals (b) pregunta si los dos objetos, dondequiera que se encuentren, tienen el mismo valor.

Esto se complica un poco por compilador de "internar", en el que el compilador puede detectar en tiempo de compilación que dos constantes tienen el mismo valor y reutilizar el mismo objeto, pero esto no será cierto para los valores creados en tiempo de ejecución.

equals() el método devolverá un valor boolean que establece que el objeto que se pasa en es 'igual a' el objeto de hacer la llamada. Esta 'es igual a' método puede ser anulado en las clases para hacer su propia prueba. En el caso de String, la prueba es si el valor de la cadena original es el mismo que el valor de la representación de cadena del objeto que se pasa en.

A medida que devuelve un booleano, puede negar el valor con un !, por lo que la prueba es 'es el argumento de un método no una cadena vacía?' ¿Si? asignarlo a la variable name.

== siempre va a probar si el objeto de la izquierda es el mismo que el objeto de la derecha, ya que se compara referencias.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top