如何按值复制对象,而不是通过引用复制
我想制作一个对象的副本,然后在一些逻辑之后,重新分配原始对象的副本值。
例:
User userCopy = //make a copy foreach(...) { user.Age = 1; user.ID = -1; UserDao.Update(user) user = userCopy; }
我不希望通过引用复制它,它必须是值的副本。
以上只是一个示例,而不是我真正想要如何使用它,但我需要学习如何按值复制。
以下是我听过的几种技巧:
-
如果类实现
Cloneable
请使用clone()
。 这个API在java中有点缺陷,我从来没有完全理解为什么clone
没有在接口中定义,而是在Object
定义。 不过,它可能会奏效。 -
手动创建克隆。 如果有一个接受所有参数的构造函数,它可能很简单,例如
new User( user.ID, user.Age, ... )
。 您甚至可能需要一个带有User:new User( anotherUser ).
的构造函数new User( anotherUser ).
-
实现从/向用户复制的内容。 该类可以具有方法
copy( User )
,而不是使用构造函数。 然后,您可以首先对对象backupUser.copy( user )
快照,然后将其还原为user.copy( backupUser )
。 您可能拥有名为backup
/restore
/snapshot
方法的变体。 -
使用状态模式 。
-
使用序列化 。 如果您的对象是图形,则可能更容易序列化/反序列化它以获得克隆。
这一切都取决于用例。 去最简单的。
编辑
我还建议你看看这些问题:
- 克隆()与复制构造函数
- 如何正确覆盖克隆方法
如果对象具有不可变对象和/或基元,则可以使用clone()
,但如果没有这些(例如集合)可能需要执行深度克隆,则可能会有一些问题。
User userCopy = (User) user.clone();//make a copy for(...) { user.age = 1; user.id = -1; UserDao.update(user) user = userCopy; }
看起来你只想保留属性: age
和id
,这是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 }
- 在jPanel上显示动画gif
- Java如何检查网站是否阻止来自Network Adminstrator
- java.lang.NoSuchMethodError:javax.servlet.http.HttpServletRequest.startAsync
- ArrayList空指针exception
- java.lang.IllegalStateException:初始化之前使用的Orca SharedPreferences
- 创建文件夹(如果Google云端硬盘中不存在)
- 试图从列表视图中的文本视图中获取值,在android中单击事件
- 是否有一种很好的方法来确定文件是否可以在Java中执行
- 如何从android中的URL下载文件的一部分?