网站首页 > 博客文章 正文
一. 泛型克隆接口:
? JDK自带的Cloneable接口虽然表明一个类支持克隆,但并未提供实际的方法实现。
? 文档提出了一种泛型化的Cloneable接口变体,该接口要求实现类提供一个类型安全的clone()方法,例如Cat类通过实现Cloneable<Cat>接口并重写clone()方法,从而能够直接返回Cat类型克隆对象,避免了类型转换的麻烦。
二. 泛型克隆类CloneSupport:
? 由于手动实现clone()方法仍需处理如CloneNotSupportedException等异常以及调用父类Object的clone()方法,为此创建了一个名为CloneSupport的基类。
? Dog类通过继承CloneSupport<Dog>,无需自行编写clone()方法就能自动获得正确且类型安全的克隆功能,前提是不能再继承其他非CloneSupport类,这是由于Java单继承限制。
三. 深克隆与便捷方法:
? 实现标准Cloneable接口进行克隆时,默认只能得到浅克隆,即原始对象引用的其他对象只做引用复制而非内容复制。
? 若要实现深克隆,可以使用第三方库如Hutool提供的ObjectUtil.cloneByStream()方法,但这要求被克隆的对象必须实现Serializable接口。
? Hutool还提供了clone(obj)和cloneIfPossible(obj)等静态方法,方便开发者快速、安全地进行对象克隆操作,具体使用细节可查阅相关文档。
参考Hutool克隆的核心包
泛型的克隆接口和克隆类
我们知道,JDK中的Cloneable接口只是一个空接口,并没有定义成员,它存在的意义仅仅是指明一个类的实例化对象支持位复制(就是对象克隆),如果不实现这个类,调用对象的clone()方法就会抛出CloneNotSupportedException异常。而且,因为clone()方法在Object对象中,返回值也是Object对象,因此克隆后我们需要自己强转下类型。
泛型克隆接口
因此,Cloneable接口应运而生。此接口定义了一个返回泛型的成员方法,这样,实现此接口后会提示必须实现一个public的clone方法,调用父类clone方法即可:
/**
* cat 类,使用实现Cloneable方式
*
*/
private static class Cat implements Cloneable<Cat>{
private String name = "miaomiao";
private int age = 2;
@Override
public Cat clone() {
try {
return (Cat) super.clone();
} catch (CloneNotSupportedException e) {
throw new CloneRuntimeException(e);
}
}
}
泛型克隆类
但是实现此接口依旧有不方便之处,就是必须自己实现一个public类型的clone()方法,还要调用父类(Object)的clone方法并处理异常。于是CloneSupport类产生,这个类帮我们实现了上面的clone方法,因此只要继承此类,不用写任何代码即可使用clone()方法:
/**
* dog 类,用于继承CloneSupport类
*
*/
private static class Dog extends CloneSupport<Dog>{
private String name = "wangwang";
private int age = 3;
}
当然,使用CloneSupport的前提是你没有继承任何的类,谁让Java不支持多重继承呢(你依旧可以让父类继承这个类,如果可以的话)。如果没办法继承类,那实现cn.hutool.clone.Cloneable也是不错的主意,因此hutool提供了这两种方式,任选其一,在便捷和灵活上都提供了支持。
深克隆
我们知道实现Cloneable接口后克隆的对象是浅克隆,要想实现深克隆,请使用:
ObjectUtil.cloneByStream(obj)
前提是对象必须实现Serializable接口。
ObjectUtil同样提供一些静态方法:clone(obj)、cloneIfPossible(obj) 用于简化克隆调用,详细的说明请查看核心类的相关文档。
猜你喜欢
- 2024-11-12 基于SpringBoot 的CMS系统,拿去开发企业官网真香(附源码)
- 2024-11-12 解决JAVA压缩图片变色问题(java压缩图片至指定大小)
- 2024-11-12 J2eeFAST 开源平台(j2ee开发工具)
- 2024-11-12 Java项目中用它来代替一半的反射使用,爽到飞起!
- 2024-11-12 反射用不好真的会影响代码执行效率!
- 2024-11-12 基于AbstractProcessor扩展MapStruct自动生成实体映射工具类
- 2024-11-12 Java面试问题(一)—— java 基础(java面试问题大全及答案大全)
- 2024-11-12 一个轻量级的Java快速开发平台快速开发项目并交付「接私活利器」
- 2024-11-12 电商系统中的 ID 是如何生成的?(电商注册账号是什么)
- 2024-11-12 用了这两款插件,同事再也不说我代码写的烂了
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)