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



pasar valor por referencia en java (6)

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:

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.


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;       
}

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 
}


¿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.





java