如何按值复制对象,而不是通过引用复制

我想制作一个对象的副本,然后在一些逻辑之后,重新分配原始对象的副本值。

例:

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

我不希望通过引用复制它,它必须是值的副本。

以上只是一个示例,而不是我真正想要如何使用它,但我需要学习如何按值复制。

以下是我听过的几种技巧:

  1. 如果类实现Cloneable请使用clone() 。 这个API在java中有点缺陷,我从来没有完全理解为什么clone没有在接口中定义,而是在Object定义。 不过,它可能会奏效。

  2. 手动创建克隆。 如果有一个接受所有参数的构造函数,它可能很简单,例如new User( user.ID, user.Age, ... ) 。 您甚至可能需要一个带有User: new User( anotherUser ).的构造函数new User( anotherUser ).

  3. 实现从/向用户复制的内容。 该类可以具有方法copy( User ) ,而不是使用构造函数。 然后,您可以首先对对象backupUser.copy( user )快照,然后将其还原为user.copy( backupUser ) 。 您可能拥有名为backup / restore / snapshot方法的变体。

  4. 使用状态模式 。

  5. 使用序列化 。 如果您的对象是图形,则可能更容易序列化/反序列化它以获得克隆。

这一切都取决于用例。 去最简单的。

编辑

我还建议你看看这些问题:

  • 克隆()与复制构造函数
  • 如何正确覆盖克隆方法

如果对象具有不可变对象和/或基元,则可以使用clone() ,但如果没有这些(例如集合)可能需要执行深度克隆,则可能会有一些问题。

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

看起来你只想保留属性: ageid ,这是int类型的,所以,为什么不试一试,看看它是否有效。

对于更复杂的场景,您可以创建“复制”方法:

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

它应该需要大约10分钟。

然后你可以用它代替:

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

要阅读有关克隆的更多信息,请阅读Joshua Bloch的这一章“有效的Java:明智地覆盖克隆”

我相信.clone()就是你所寻找的,只要课程支持它。

你不能只做一个复制构造函数吗? 顺便说一下,Java总是按值传递引用,所以你一直指向同一个对象。

您需要从用户复制到用户复制,然后在登录后,您可以将userCopy引用重新分配给用户。

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

这是什么语言? 如果您使用的语言通过Java等引用传递所有内容(本机类型除外),通常可以调用.clone()方法。 .clone()方法通常通过将所有相关实例字段复制/克隆到新对象中来实现。

我知道这有点太晚了,但它可能只是帮助某人。

在我的情况下,我已经有一个方法从json对象生成Object并从对象生成json。 通过这个,您可以简单地创建对象的新实例并使用它来还原。 例如,在解析最终对象的函数中

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