偶今天真是郁闷呀,在系统中用了一个静态的hashtable缓存工作流定义(因为在运行期,工作流定
义是不可能改变的),但是偶忘了在调用客户端的JAVABEAN时,业务系统给JAVABEAN的参数重新赋了值,
结果..........,偶都不好意思说了,所有的实例都取了第一次的赋值。于是乎,偶赶紧给JAVABEAN对象
实现了Cloneable,然后在给参数重新赋值的地方,用clone的对象,嘿嘿,应该没问题了吧,重新测
试.........,偶呆了,第二次赋值竟然还是取的缓存的值,MY GOD!难道是偶见鬼了?再仔细瞅瞅,哦
,原来是,javabean对象虽然用了clone后的,但是它的成员对象ParameterInfo还保留着原来的引用,即
内存里虽然是有了两个javabean对象,但是这两个对象都用的是对一个ParameterInfo对象的引用,偶赶
紧去查clone...........唉,偶真是汗颜呀,其实就是一个影子clone和深度clone的问题。原来偶用的竟
是影子clone!
以下引自《java中传值和传址及其引伸深度克隆的思考》
“java中的所有对象都是Object类的子类,Object类定义了protected clone()方法,它的作用和c++
中按位复制是一样的,因此同样会带来如果对象中包含另一个对象(注意是对象不是基本数据类型,基本
数据类型直接就会被复制)的指针(java中的句柄),clone并没有将被包含的对象clone,而是复制了被
包含对象的句柄或者说指针。因此并不能认为复制出来的对象就可以随心所欲的修改,因为它和被clone
的对象都包含同一个对象,因此可能会引起潜在的冲突问题。至于深度clone的方法很简单,就是在子类
中覆盖父类Object类中clone方法,保证每一个被包含的对象都被按照位被clone。如果包含的数据全部是
基本类型数据,那么就什么也不用做了。深度clone还有另一种方法就是利用Serializable,但是对象中被
transient关键字修饰的变量是不会被序列化的. 因为clone用到的地方并不多,就不多说了。但是当你遇
到的时候,一定要小心。”
分享到:
相关推荐
Jlink v8固件修复或解决Clone问题,内有固件下载地址。
解决git clone时报错问题:sign_and_send_pubkey: signing failed: agent refused operation
对java clone的一些讲解,以及我个人的一些心得等等,
git clone 最新版 不多说上资源 好用测试ok git clong git clone 最新版 不多说上资源 好用测试ok git clong
Clone 属性的相关内容 Clone 属性的相关内容
已经修改过固件的偏移地址,上电后 mdk会升级,正常现象,让他升级好了,不会有问题,升级完就可以正常使用了. 具体原因如下:由于固件的原因,Jlink一插上电脑就提示Jlink是clone,后来发现J-link_v8.bin这个固件还需要...
彻底解决Mac端git clone/push速度太慢的问题,详情请参阅文档。
主要用于解决Jlink v8的固件重新烧写,或解决Jlink v8的克隆问题。
Clone10-EX-LV2
在使用高版本版KEIL时,提示要升级固件,升级后就出现JLINK is Clone的提示!“the emulator is JLink-Clone, the segger software only support orginal segger device” 然后闪退,IDE崩溃关闭! 解决方案: 1....
支持多个git库clone,提交等常用操作,用户需要根据实际情况微调参数
当项目很大,有一些很大的文件存在时,clone远程仓库代码可能会失败,clone下来的项目不完整,很可能是因为项目中的文件clone不全,这个工具可以解决这个问题
jquery.clone
Minesweeper CLone 0.97 Saolei.net扫雷网,小门汉化 Men Shiyun Mine.exe 请自行下载MinesweeperClone_0.97.exe安装后使用
java中clone的详细用法,分浅拷贝和深拷贝,并分别有详细的实例介绍。从原理分析。
详细的描述了Java中 clone方法使用
用 Java 语言编写的 初学者可学习的clone()
Jlink-clone解决办法,替换文件
compass git clone compass git clone
中文语音克隆内含数据集和预训练模型:voice clone