Pregunta

  

Duplicar posible:
   Es “El paso por referencia” Java?

He encontrado un método Java inusual hoy en día:

private void addShortenedName(ArrayList<String> voiceSetList, String vsName)
{
     if (null == vsName)
       vsName = "";
     else
       vsName = vsName.trim();
     String shortenedVoiceSetName = vsName.substring(0, Math.min(8, vsName.length()));
     //SCR10638 - Prevent export of empty rows.
     if (shortenedVoiceSetName.length() > 0)
     {
       if (!voiceSetList.contains("#" + shortenedVoiceSetName))
         voiceSetList.add("#" + shortenedVoiceSetName);
     }
}

De acuerdo con todo lo que he leído sobre el comportamiento de Java para pasar variables, objetos complejos o no, este código debe hacer exactamente nada. Así um ... me estoy perdiendo algo aquí? ¿Hay alguna sutileza que se perdió en el yo, o el código pertenece en thedailywtf?

¿Fue útil?

Solución

Como dijo Rytmis, Java pasa referencias por valor. Lo que esto significa es que se puede llamar legítimamente mutando métodos en los parámetros de un método, pero no se puede reasignar ellos y esperar que el valor se propague.

Ejemplo:

private void goodChangeDog(Dog dog) {
    dog.setColor(Color.BLACK); // works as expected!
}
private void badChangeDog(Dog dog) {
    dog = new StBernard(); // compiles, but has no effect outside the method
}

Editar Lo que esto significa en este caso es que aunque voiceSetList podría cambiar como resultado de este método (que podría tener un nuevo elemento añadido a la misma), la cambios en vsName no serán visibles fuera del método. Para evitar la confusión, a menudo me recuerda mis final parámetros del método, lo que les impide ser reasignado (accidentalmente o no) dentro del método. Esto mantendría el segundo ejemplo de la compilación en absoluto.

Otros consejos

pasa de Java referencias de valor , para que pueda obtener una copia de la referencia, pero el objeto de referencia es el mismo. Por lo tanto este método no hace modificar la lista de entrada.

Las referencias mismos se pasan por valor.

A partir de Java Cómo programar, 4ª Edición por Deitel y Deitel: (Pág. 329)

  

A diferencia de otros lenguajes, Java no permite al programador elegir si desea pasar   cada argumento por valor o por referencia. Las variables de tipo de datos primitivos se pasan siempre   por valor. Los objetos no se pasan a los métodos; más bien, las referencias a objetos se pasan a   métodos. Las referencias a sí mismos se pasan por valor, una copia de una referencia se pasa   a un método. Cuando un método recibe una referencia a un objeto, el método puede manipular   el objeto directamente.

Se utiliza este libro cuando se está aprendiendo en la universidad de Java. referencia Brilliant.

He aquí un buen artículo que explica ella. http://www.javaworld.com/javaworld /javaqa/2000-05/03-qa-0526-pass.html

Bueno, puede manipular el ArrayList - que es un objeto ... si estás de paso una referencia de objeto alrededor (incluso pasado por valor), los cambios en ese objeto se reflejará a la persona que llama. Es esa la pregunta?

Creo que está confundido porque vsNombre se modifica. Pero en este contexto, es sólo una variable local, al mismo nivel exacto como shortenedVoiceSetName.

No me queda claro cuál es la pregunta exacta dentro del código. Java es el paso por valor, pero son matrices de pasar por referencia a medida que pasan ningún objeto, sino sólo los punteros! Las matrices constan de punteros, no objetos reales. Esto los hace muy rápido, pero también los hace peligrosos de manejar. Para solucionar esto, es necesario clonar ellos para obtener una copia, e incluso entonces sólo va a clonar la primera dimensión de la matriz.

Para más detalles, véase mi respuesta aquí: En Java, lo que es una copia superficial? (también ver mis otras respuestas)

Por cierto, hay algunas ventajas como matrices son sólo los punteros: se puede (ab) uso de ellos como objetos sincronizados

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