Me gustaría tener semántica similar a C#
's ref
palabra clave.¿Puedo pasar parámetros por referencia en Java?
Respuesta
Java es confuso porque todo se pasa por el valor. Sin embargo, para un parámetro del tipo de referencia (es decir, no es un parámetro de tipo primitivo) es la referencia en sí que se pasa por valor, por lo que aparece para pasar por referencia (y la gente suele afirmar que es). Este no es el caso, como lo demuestra el siguiente:
Object o = "Hello";
mutate(o)
System.out.println(o);
private void mutate(Object o) { o = "Goodbye"; } //NOT THE SAME o!
imprimirá Hello
a la consola. Las opciones si se quería que el código anterior para imprimir Goodbye
son para uso una referencia explícita de la siguiente manera:
AtomicReference<Object> ref = new AtomicReference<Object>("Hello");
mutate(ref);
System.out.println(ref.get()); //Goodbye!
private void mutate(AtomicReference<Object> ref) { ref.set("Goodbye"); }
Además, una matriz de longitud 1 se puede utilizar para crear una referencia si realmente quiere confundir a las personas :) – Christoffer
Esto es muy cierto –
AtomicReference y las clases correspondientes (AtomicInteger) son las mejores para tales operaciones – Naveen
no creo que pueda. Su mejor opción podría ser encapsular lo que desea pasar "por ref" en otra instancia de clase, y pasar la referencia de la clase (externa) (por valor). Si ves lo que quiero decir ...
es decir, tu método cambia el estado interno del objeto que se pasa, que luego es visible para la persona que llama.
En Java no hay nada a nivel de lenguaje similar a ref. En Java no únicamente de paso por valor semántico
En aras de la curiosidad se puede implementar un ref-como semántica en Java simplemente envolviendo sus objetos en una clase mutable:
public class Ref<T> {
private T value;
public Ref(T value) {
this.value = value;
}
public T get() {
return value;
}
public void set(T anotherValue) {
value = anotherValue;
}
@Override
public String toString() {
return value.toString();
}
@Override
public boolean equals(Object obj) {
return value.equals(obj);
}
@Override
public int hashCode() {
return value.hashCode();
}
}
caso_prueba:
public void changeRef(Ref<String> ref) {
ref.set("bbb");
}
// ...
Ref<String> ref = new Ref<String>("aaa");
changeRef(ref);
System.out.println(ref); // prints "bbb"
¿Puedo pasar los parámetros por referencia en Java?
Nº
¿Por qué? Java tiene solo un modo de pasar argumentos a métodos: por valor.
Nota:
Por primitivas esto es fácil de entender: se obtiene una copia del valor.
Para todos los demás obtiene una copia de la referencia y esto también se llama pasar por valor.
Todo está en esta imagen:
Java siempre se pasan por valor.
Cuando pasa una primitiva es una copia del valor, cuando pasa un objeto, es una copia del puntero de referencia.
De James Gosling en "The Java Programming Language":
"... No es exactamente el modo de cruce un parámetro en Java - paso por valor - y que mantiene las cosas simples ..."
El pronunciamiento del dios del lenguaje debe ser declarado la respuesta. – ingyhere
@ingyhere: 'La declaración del dios del lenguaje debe ser declarada la respuesta': No realmente. A pesar de lo que el creador de Java piense o crea, la respuesta absoluta vendría de una cita de la especificación del lenguaje. – paercebal
De hecho, está en [JLS, en la sección 8.4.1] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.1), y el JLS cita a Gosling como primer autor: "Cuando se invoca el método o el constructor (§15.12), ** los valores de las expresiones reales del argumento inicializan las variables de parámetros recién creadas **, cada uno del tipo declarado, antes de la ejecución del cuerpo del método o constructor ". – ingyhere
Otra opción es usar una matriz, por ejemplo void method(SomeClass[] v) { v[0] = ...; }
pero 1) la matriz se debe inicializar antes de invocar el método, 2) aún no se puede implementar, p. método de intercambio de esta manera ... Esta forma se usa en JDK, p. en java.util.concurrent.atomic.AtomicMarkableReference.get(boolean[])
.
- 1. no puede pasar parámetros por referencia en MySQLi
- 2. ¿Cómo puedo pasar una referencia a una función, con parámetros?
- 3. ¿Es posible pasar parámetros por referencia usando call_user_func_array()?
- 4. ¿Cómo puedo pasar una referencia de objeto Scala en Java?
- 5. C++/CLI: ¿Por qué no puedo pasar cadenas por referencia?
- 6. Al pasar datos primitivos por referencia en Java
- 7. Pasando por referencia en Java?
- 8. Problema al pasar por referencia
- 9. ¿Pasa Java por referencia?
- 10. Bash - Pasar argumentos por referencia
- 11. Pasar una matriz por referencia
- 12. Java: mejor manera de pasar int por referencia
- 13. ¿Cuál es la diferencia entre pasar por referencia en Java y pasar un puntero en C?
- 14. ¿Es ineficiente pasar objetos grandes como parámetros en Java?
- 15. ¿es posible pasar por referencia en RMI?
- 16. 'pasar parámetro por referencia' en Ruby?
- 17. Cuándo pasar por referencia en PHP
- 18. PHP Pasar por referencia en foreach
- 19. ¿Puedo pasar auto_ptr por referencia a las funciones?
- 20. ¿En Scala puedo pasar parámetros repetidos a otros métodos?
- 21. C# Pasar una propiedad por referencia
- 22. Solo se pueden pasar variables por referencia
- 23. PHP por referencia parámetros y nulo por defecto
- 24. arrays PHP y pasar por referencia
- 25. PDO pasar por aviso de referencia? Este
- 26. Pasar argumentos de matriz por referencia
- 27. ¿cuál es la diferencia entre pasar por referencia y llamar por referencia?
- 28. ¿Los métodos de extensión C# no permiten pasar parámetros por referencia?
- 29. Pasar matrices como parámetros de método en Java
- 30. Cómo pasar valores por referencia en el objetivo C (iphone)
Salam. esta respuesta resuelve mi problema: [http://stackoverflow.com/a/9324155/1676736](http://stackoverflow.com/a/9324155/1676736) –