valor setear salida referencia por pasar parametros parametro objetos objeto enviar datos como arreglo java

java - setear - Cómo copiar un objeto por valor, no por referencia



pasar un arreglo de objetos como parametro en java (7)

¿No puedes simplemente hacer un constructor de copia? Por cierto, Java siempre pasa las referencias por valor, por lo que sigue apuntando al mismo objeto.

Esta pregunta ya tiene una respuesta aquí:

Quiero hacer una copia de un objeto, luego, después de alguna lógica, reasignar al objeto original el valor de la copia.

ejemplo:

User userCopy = //make a copy foreach(...) { user.Age = 1; user.ID = -1; UserDao.Update(user) user = userCopy; }

No quiero una copia por referencia, tiene que ser una copia por valor.

Lo anterior es solo una muestra, no cómo realmente quiero usarla, pero necesito aprender a copiar por valor.


¿Qué lenguaje es este? Si está usando un lenguaje que pasa todo por referencia como Java (excepto los tipos nativos), normalmente puede llamar .clone() método .clone() . El método .clone () se implementa normalmente copiando / clonando todos los campos de instancia relevantes en el nuevo objeto.


Aquí están las pocas técnicas que he escuchado de:

  1. Usa clone() si la clase implementa Cloneable . Esta API es un poco defectuosa en java y nunca entendí bien por qué el clone no está definido en la interfaz, sino en Object . Aún así, podría funcionar.

  2. Crear un clon manualmente. Si hay un constructor que acepta todos los parámetros, puede ser simple, por ejemplo, new User( user.ID, user.Age, ... ) . Es posible que incluso desee un constructor que tome un Usuario: new User( anotherUser ).

  3. Implementar algo para copiar de / a un usuario. En lugar de utilizar un constructor, la clase puede tener una copy( User ) método copy( User ) . Luego puede hacer una instantánea del objeto backupUser.copy( user ) y luego restaurarlo user.copy( backupUser ) . Es posible que tenga una variante con métodos denominados backup / restore / snapshot .

  4. Usa el patrón de estado .

  5. Utilice la serialization . Si su objeto es un gráfico, podría ser más fácil serializarlo / deserializarlo para obtener un clon.

Todo eso depende del caso de uso. Ve por lo más simple.

EDITAR

También recomiendo echar un vistazo a estas preguntas:


Creo que .clone() es lo que estás buscando, siempre y cuando la clase lo apoye.


Debe hacer una copia detallada del usuario a la copia del usuario, y luego, después de iniciar sesión, puede reasignar su referencia de usuario copia al usuario.

User userCopy = new User(); userCopy.Age = user.Age userCopy.ID = user.ID foreach(...) { user.Age = 1; user.ID = -1; UserDao.Update(user) user = userCopy; }


Puede usar clone() que funciona bien si su objeto tiene objetos inmutables y / o primitivos, pero puede ser un poco problemático cuando no tiene estos (como colecciones) para los que puede necesitar realizar un clon profundo.

User userCopy = (User) user.clone();//make a copy for(...) { user.age = 1; user.id = -1; UserDao.update(user) user = userCopy; }

Parece que solo desea conservar los atributos: age e id que son de tipo int , así que, ¿por qué no lo prueba y ve si funciona?

Para escenarios más complejos, podría crear un método de "copia":

publc class User { public static User copy( User other ) { User newUser = new User(); newUser.age = other.age; newUser.id = other.id; //... etc. return newUser; } }

Debería llevarte unos 10 minutos.

Y luego puedes usar eso en su lugar:

User userCopy = User.copy( user ); //make a copy // etc.

Para leer más sobre el clon, lea este capítulo en Joshua Bloch "Eficaz Java: sobrescriba el clon con criterio"


Sé que esto es un poco tarde pero podría ayudar a alguien.

En mi caso, ya tenía un método para hacer el objeto a partir de un objeto json y hacer json a partir del objeto. con esto, simplemente puede crear una nueva instancia del objeto y usarlo para restaurar. Por ejemplo, en una función analizando un objeto final

public void update(final Object object){ final Object original = Object.makeFromJSON(object.toJSON()); // the original is not affected by changes made to object }