美文网首页
提示十三

提示十三

作者: 飞絮搅青冥 | 来源:发表于2022-05-26 00:07 被阅读0次

今天来看提示十三:谨慎地覆盖clone。

我们经常遇到想要克隆一个对象的需求,Object类中存在一个protected方法clone(),这是一个本地方法,会返回该对象的逐个属性的拷贝。这是一个浅拷贝,即如果这个类中某个属性是一个复杂对象,那么返回的克隆对象中的该属性只是一个引用而非新的对象。我猜测这里的clone是基于反射来做的,可惜没有什么好方法来证实,或许可以编译以后再反编译打开看看。

书中Object的规范中clone方法有这样几条通用的约定(不是必须的要求):

  • x.clone() != x
  • x.clone().getClass() == x.getClass()
  • x.clone().equals(x)

另外还有这样几条有用的信息:

  1. immutable的类不应该提供clone方法。
  2. 公有的clone方法应该省略throws,为了继承而设计的类不应该实现Cloneable
  3. 如果需要线程安全的Cloneable方法,需要使用synchronized
  4. 对象复制更好的方法是提供一个复制构造方法或复制工厂。 复制构造方法接受参数,其类型为包含此构造方法的类。
// Copy constructor public Yum(Yum yum) { ... };
// Copy factory public static Yum newInstance(Yum yum) { ... };

我们系统中也使用了cloneable接口,但是一般都是一些简单的vo,那么直接实现接口,不需要覆盖clone方法也能满足要求,但是考虑到proctected的方法的使用范围,一般都会重写clone方法,把方法的范围改成public同时可以返回更为具体的类,而非Object。但是面对复杂对象,需要深拷贝的情况下,cloneable接口就感觉有一些力不从心了。当然我们也可以递归调用clone方法来实现,但是目前我们更普遍的做法是json来序列号在反序列化来简单实现这一需要,当然更复杂的情况需要手工处理更多的信息就不讨论了。


浅拷贝

相关文章

  • 提示十三

    今天来看提示十三:谨慎地覆盖clone。 我们经常遇到想要克隆一个对象的需求,Object类中存在一个protec...

  • 温馨提示(十三)

    1、勤学似春起之苗,不见其增,日有所长;辍学如磨刀之石,不见其损,日有所亏。 2、你越是滔滔不绝的时候,你的愚蠢就...

  • 提示三十三

    提示三十三:考虑类型安全的异构容器 泛型常用于集合,被充当被参数化了的容器,这样就限制了每个容器都只能有固定个数的...

  • 提示23-24估算

    今天继续学习本书估算的相关内容,涉及了提示二十三和二十四。 提示二十三:通过估算来避免,意外。提示二十四:根据代码...

  • 提示四十三

    提示四十三:方法引用优于 lambda 表达式。 lambda 优于匿名类的主要优点是它更简洁,而方法引用比它更简...

  • 提示二十三

    今天来看提示二十三: 类层次优于标签类。 作者使用了Figure的例子说明了标签类是那种拥有多种风格实例,通过标签...

  • 提示42-43

    今天学习有关不要冲出前灯范围的内容,先看提示: 提示四十二:小步前进——由始至终。提示四十三:避免占卜。 做预测很...

  • 温馨提示(二十三)

    1、好习惯养成了,一辈子受用;坏习惯养成了,一辈子吃亏。 2、不到万不得已,尽量少开口求人。 3、耐心听人讲话,是...

  • 提示五十三、五十四

    提示五十三:慎用可变参数。 如果可变参数要求至少要求一个参数的话,可以使用这种样式。 在重视性能的情况下,因为可变...

  • 亿万财富之谜:罗永浩与李笑来的彪悍人生

    文/郭亮(微信:15801290112,公号:guol33/郭三十三) 提示:全文1...

网友评论

      本文标题:提示十三

      本文链接:https://www.haomeiwen.com/subject/wpzyprtx.html