请教:Vaadin教程中save方法使用clone的作用
为什么Vaadin教程里的save方法要使用clone?
我来帮你拆解这段代码里clone()的作用,核心目的是为了数据隔离和一致性,具体原因可以分成这几点来看:
防止外部引用意外修改存储的数据
如果直接把传入的entry对象存入contactsMap,任何持有这个entry引用的外部代码,后续修改它的属性(比如setFirstName("NewName"))都会直接改变Map里存储的对象。通过clone()创建副本再存储,原对象和存储的副本就完全独立了,外部修改原对象不会影响已保存的数据。保存当前状态的“快照”
调用save()时,我们需要的是这个客户对象此刻的状态。clone相当于对当前对象拍了一张快照存起来,之后无论原对象怎么修改,已经保存的版本都不会被回溯改动,这和数据库持久化时保存提交时刻数据的逻辑一致。适配内存数据存储的隔离需求
这段代码里的contacts是一个内存中的数据存储(类似简易数据库),在这种场景下,clone是一种简单高效的方式实现业务对象和存储对象的解耦,避免业务代码和存储层共享同一个对象实例导致的意外副作用。
另外补充个细节:你的Customer类成员变量都是不可变类型(Long、String、LocalDate、枚举CustomerStatus),所以这里的浅克隆(Object.clone()默认是浅克隆)就足够安全,不会出现深层引用共享的问题,副本和原对象的属性值都是独立(或本身不可变、无法修改)的。
内容的提问来源于stack exchange,提问作者shiva
相关产品推荐
相关产品推荐

