Java 基于 Cloneable 接口实现原型模式(浅拷贝与深拷贝)

前言

在业务开发中,有时需要对业务对象进行一次复制,得到一个一模一样的副本。最直观的做法就是重新 new 一个对象,然后将原型对象的值依次设置到克隆对象中,但是这样写代码过于冗余,也不高效。

设计模式中的原型模式便可以很好的解决这个问题,Java 已经内置了抽象原型接口 Cloneable,只需要实现该接口,便能够通过 clone 方法快速复制一个克隆的对象,应当注意的是,clone 是浅拷贝,如果类中存在引用对象属性,则原型对象和克隆对象的该属性会指向同一个对象引用。

实现深拷贝,有两种方式

  1. 在调用 super.clone() 后,再依次调用引用对象属性的 clone 方法
  2. 使用序列化实现

实战代码

浅拷贝

public class Item implements Cloneable, Serializable {private int a;private float b;private double c;private String d;public Item(int a, float b, double c, String d){this.a = a;this.b = b;this.c = c;this.d = d;}public int getA() {return a;}public void setA(int a) {this.a = a;}public float getB() {return b;}public void setB(float b) {this.b = b;}public double getC() {return c;}public void setC(double c) {this.c = c;}public String getD() {return d;}public void setD(String d) {this.d = d;}@Overridepublic String toString() {return "Item{" +"a=" + a +", b=" + b +", c=" + c +", d='" + d + '\'' +'}';}@Overrideprotected Item clone() {Item item = null;try {item = (Item)super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return item;}}

深拷贝

public class RefItem implements Cloneable, Serializable {Item item;public RefItem(Item item) {this.item = item;}public Item getItem() {return item;}public void setItem(Item item) {this.item = item;}@Overridepublic String toString() {return "RefItem{" +"item=" + item +'}';}/*** 层层递进调用clone方法* */@Overrideprotected RefItem clone() {RefItem refItem = null;try {refItem = (RefItem)super.clone();refItem.item = refItem.item.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return refItem;}/*** 通过实现Serializable接口* */public static <T extends Serializable> T clone(T obj) {T cloneObj = null;try {// 写入字节流ByteArrayOutputStream out = new ByteArrayOutputStream();ObjectOutputStream obs = new ObjectOutputStream(out);obs.writeObject(obj);obs.close();// 写入原始对象,生成新对象ByteArrayInputStream ios = new ByteArrayInputStream(out.toByteArray());ObjectInputStream ois = new ObjectInputStream(ios);// 返回生成的新对象cloneObj = (T) ois.readObject();ois.close();} catch (Exception e) {e.printStackTrace();}return cloneObj;}}

在 spring 项目中,可直接使用 spring 框架的工具类,将代码简化

/*** 通过实现Serializable接口* */public static <T extends Serializable> T clone(T obj) {return (T) SerializationUtils.deserialize(SerializationUtils.serialize(obj));}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/736091.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

各个类linux服务器安装docker教程

由于开始经常使用docker搭建环境了&#xff0c;但是的docker在不同的机器上安装总是会遇到许多问题&#xff0c;因此呢&#xff0c;一下决定总结一些docker环境的安装过程。 Centos7 Docker&Docker-Compose安装教程_centos7 docker-compose 安装_MrNeoJeep的博客-CSDN博客…

恒驰上云规划实施解决方案上线华为云官网

华为云与伙伴共同打造联合解决方案 已成为更多企业的数字化转型利器 1月恒驰上云规划实施解决方案 完成上市宣讲并正式上架华为云官网 恒驰上云规划实施解决方案能力全景图&#xff1a;融合厂商云服务能力&#xff0c;一站式高效云迁移 从深入了解企业的本地IT环境、业务特点…

分享一下 iOS 发布/测试证书 申请过程

1.使用 已开通iOS开发者 的账号登陆 Apple Developer Apple Developer 2.点击下图右上角的 Account&#xff08;账户&#xff09; 点击下图中的 certificates&#xff08;证书&#xff09; 然后会挑战至下图所示页面 3.然后先要注册一个 App id 点击 register 就完成了 4.…

【JAVA】CSS2:样式、选择器、伪类、颜色、字体、边框、列表、背景、盒子、布局、浮动

本文介绍了CSS样式、选择器、伪类、像素、颜色、字体、边框、列表、表格属性、背景、盒子、布局与浮动 1.样式 1.1 行内样式 <h1 style"color: aqua;font-size: large;">123</h1> 1.2 内部样式 <style>h1{color: red;font: 100;}</style>…

Oracle SQL优化(读懂执行计划 一)

目录 SQL执行计划的作用示例演示执行计划概念介绍执行计划实例DISPLAY_CURSOR 类型DISPLAY_AWR 类型 指标详解 SQL执行计划的作用 示例演示 执行计划概念介绍 执行计划实例 DISPLAY_CURSOR 类型 DISPLAY_AWR 类型 指标详解

vim基础命令

目录 前言 一.vim基础命令大全 二.vim熟练的好处 三.入门使用命令 四.使用案例 4.1 gg和G 4.2 i 和 u 和 ESC使用 4.3 y$ 和 p 和 u 使用 五.注意事项 前言 启动vim编辑器后自动进入编辑模式&#xff0c;在此模式中输入命令对应vim一个动作&#xff0c;比如&#xff1a;进入编辑…

linux 配置jdk环境变量

1.确保已上传jdk包到指定目录 2.打开终端&#xff0c;使用文本编辑器&#xff08;比如vi、nano等&#xff09;创建或修改~/.bashrc文件。命令为&#xff1a; sudo vi ~/.bashrc3.在.bashrc文件末添加以下内容&#xff1a; export JAVA_HOME/usr/local/jdk/jdk1.8.0_391 #将…

【Docker】Tensorflow 容器化部署

Tensorflow环境标准软件基于Bitnami Tensorflow 构建。当前版本为2.16.1 你可以通过轻云UC部署工具直接安装部署&#xff0c;也可以手动按如下文档操作&#xff0c;该项目已经全面开源&#xff0c;可以从如下环境获取 配置文件地址: https://gitee.com/qingplus/qingcloud-pla…

理解STM32的低功耗模式

低功耗模式简介 TM32的低功耗模式是特别设计来减少微控制器在不活跃状态下的能耗。这些模式允许STM32在保持核心功能的同时尽可能减少电力消耗&#xff0c;适合用在电池供电或需长期运行的场景。理解各种低功耗模式如何节能&#xff0c;主要包括以下几个方面&#xff1a; 关闭…

C++类和对象(下篇)

目录 一.再谈构造函数 二.static成员 三.友元 四.内部类 五. 再次理解类和对象 一.再谈构造函数 1.构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值。 class Date { public:Date(int year, int month…

MES系统是怎么进行数据采集的?

在MES管理系统中&#xff0c;数据采集作为最基础也最为关键的一环&#xff0c;对于实现生产过程的透明化、可控好以及优化生产流程具有重要意义。 mes系统是怎么采集数据的? 一、PLC类数据采集&#xff1a;使用C#或C直接编程访问PLC(不需要花钱买组态软件或第三方软件) 二、…

HTML 学习笔记(四)图片

<!--通过图片标签"<img src "图片路径">"来调用图片在网页中进行显示--> <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthd…

C++ 文件操作

目录 C文件操作1. 使用系统函数读写linux平台判断是否存在创建文件 create()接口打开文件 open()接口读取文件 read()接口写文件 write()接口关闭文件 close()接口调整读写文件的位置&#xff08;偏移量&#xff09;lseek()接口获取文件基本信息操作文件状态 fcntl函数 windows…

PostgreSQL索引篇 | GiST索引

GiST索引 PostgreSQL版本为8.4.1 &#xff08;本文为《PostgreSQL数据库内核分析》一书的总结笔记&#xff0c;需要电子版的可私信我&#xff09; GiST&#xff08;Generalized Search Tree&#xff0c;通用搜索树&#xff09;是一种平衡的、树状结构的访问方法。 它在系统中…

java复健01——jdk17、maven3.5、vscode的安装

遇到的问题以及解决方案 Q1. 用choco安装jdk17、jdk20均失败&#xff0c;报一些奇奇怪怪的错 A1&#xff1a; 最稳妥的方法&#xff1a;用管理员权限运行cmd或者shell&#xff0c;用choco search jdk命令看一下有什么版本的jdk&#xff0c;如果列表里没有&#xff0c;应该是…

【数学建模】传染病模型笔记

传染病的基本数学模型&#xff0c;研究传染病的传播速度、空间范围、传播途径、动力学机理等问题&#xff0c;以指导对传染病的有效地预防和控制。常见的传染病模型按照传染病类型分为 SI、SIR、SIRS、SEIR 模型等&#xff0c;按照传播机理又分为基于常微分方程、偏微分方程、网…

代购系统小程序商城APP快速上货采集商品API接口

搜索采集商品使用item_search获取商品id列表&#xff0c;全店商品采集使用item_search_shop获取整店商品id列表&#xff0c;支持翻页显示。获取到的商品id列表再传入获取商品详情接口item_get来获取商品详情页的详情信息。 item_search-按关键字搜索淘宝商品 item_search_sho…

Redis特性与应用场景

Redis是一个在内存中存储数据的中间件&#xff0c;用于作为数据库&#xff0c;用于作为数据缓存&#xff0c;在分布式系统中能够发挥重要作用。 Redis的特性 1.In-memory data structures: MySQL使用表的方式存储数据&#xff0c;这意味着数据通常存储在硬盘上&#xff0c;并且…

python 网络库集锦

目录 通用网络库 网络爬虫框架 1.功能齐全的爬虫 2.其他 HTML/XML解析器 1.通用 2.清理 文本处理 自然语言处理 浏览器自动化与仿真 多重处理 异步网络编程库 队列 云计算 网页内容提取 WebSocket DNS解析 计算机视觉 通用网络库 1.urllib -网络库(stdlib)。…

Unity自带的WebSocket使用说明

Unity中的WebSocket是一种用于实时性强、低延迟的双向通信的技术。它可以在客户端和服务器之间建立一个持久的连接&#xff0c;允许双方随时互相发送数据。这种实时性使得WebSocket在游戏中非常有用&#xff0c;特别是对于多人在线游戏和实时竞技游戏。 在Unity中&#xff0c;…