当前位置: 首页 > news >正文

网站建设合同付款方式济南做网站公司

网站建设合同付款方式,济南做网站公司,网站排名查询站长之家,开网店文章目录 1.原型模式概述2.浅拷贝与深拷贝2.1.浅拷贝的实现方式2.2.深拷贝的实现方式 3.结语 1.原型模式概述 原型模式是一种非常简单易懂的模型#xff0c;在书上的定义是这样的#xff1a; Specify the kinds of objects to create using a prototypical instance,and cre… 文章目录 1.原型模式概述2.浅拷贝与深拷贝2.1.浅拷贝的实现方式2.2.深拷贝的实现方式 3.结语 1.原型模式概述 原型模式是一种非常简单易懂的模型在书上的定义是这样的 Specify the kinds of objects to create using a prototypical instance,and create new objects by copying this prototype. 用原型实例指定创建对象的种类并且通过拷贝这些原型创建新的对象。 通俗的讲就是有一个现成的对象我们通过复制或拷贝这个对象的方式来创建一个新的对象这就是原型模式。 那么我们为什么需要通过拷贝来创建对象呢 我认为主要体现在两个维度程序运行效率和开发效率 程序运行效率如果对象的创建和初始化的代价比较大创建比较繁琐例如需要从数据库、RPC、网络等获取一些数据才能完成创建这时候使用原型模式拷贝出一个对象无疑是效率更高的做法。开发效率我们在业务开发中会涉及到不同的分层每个分层都有自己的数据实例例如与前端交互的VO对象数据传输的DTO对象与数据库交互的PO对象等等这些对象转换的过程中大部分的字段值都是相同的如果每一层都使用getter/setter方法来进行赋值开发效率就很容易受到影响尤其是在迭代中增加了新字段的情况下每一层都需要新增一个字段set方法很麻烦也很容易做漏这时候使用原型模式来进行复制就比较方便了。 严格的说原型模式是同一个类型下的不同实例的数据拷贝对于不同类型的实例拷贝更应该归类于原型模式的一种拓展用法。不过在业务中这种拓展用法使用的频率更高接下来的示例也是以这种拓展用法为主。 2.浅拷贝与深拷贝 想要在使用原型模式的时候不出现一些“意外”那就得先了解浅拷贝与深拷贝之间的区别。 两者的区分非常好理解关键点就是在对引用类型的成员变量拷贝上两种拷贝类型有不同的结果 浅拷贝只会将原始对象中的引用类型变量的内存地址复制给目标对象的同名成员变量。深拷贝会以引用类型变量的类型为基础创建一个崭新的对象再把这个新对象的内存地址赋值给目标对象的对应同名成员变量。 对于浅拷贝来说如果原始对象中有其他的引用类型变量在拷贝出目标对象后两个对象对于该引用类型变量的修改会互相影响但是由于不需要针对引用类型的变量查询新的对象这种拷贝方式的效率较高。在不会修改变量值或者只需要修改基本类型的变量值包含String时优先考虑使用浅拷贝。 如果拷贝的对象中包含了引用类型的对象且需要进行修改或者拷贝不同类型但内部字段相同的对象例如UserPO和UserDTO可以考虑使用深拷贝。 2.1.浅拷贝的实现方式 浅拷贝的实现方式有很多归类起来主要是两种一种是使用Java原生的方式另一种是通过开源的工具包实现。 先看看Java原生的方式实现一个Cloneable接口并覆写父类Object中的clone方法 Getter Setter public class User implements Cloneable {private String name;private int age;private Phone phone;Overridepublic User clone() throws CloneNotSupportedException {return (User) super.clone();} }Getter Setter public class Phone {private String phoneNumber; }为了验证浅拷贝这里还加入了一个Phone对象接下来就做个测试。 public static void main(String[] args) throws CloneNotSupportedException {User user new User();user.setName(张三);user.setAge(18);user.setPhone(new Phone());User cloneUser user.clone();System.out.println(user.getPhone() cloneUser.getPhone()); }打上一个断点查看两个对象可以看到User对象已经成功复制并且里面的Phone对象明显是同一个对象 使用开源的工具常用的有两种工具分别是Apache commons中的BeanUtils或PropertyUtilsSpring中的BeanUtils他们都有一个共同的方法是copyProperties用来拷贝对象属性。在实现中虽然Apache和Spring都是通过反射来实现的但是Spring针对反射做了一层缓存在相同类型的对象复制中效率高于Apache所以我们选择使用Spring的拷贝。 没有Spring依赖的话需要引入依赖包 dependencygroupIdorg.springframework/groupIdartifactIdspring-beans/artifactIdversion5.3.9/version /dependency修改一下代码可以得到一样的结果 public static void main(String[] args) {User user new User();user.setName(张三);user.setAge(18);user.setPhone(new Phone());User cloneUser new User();BeanUtils.copyProperties(user, cloneUser);System.out.println(user.getPhone() cloneUser.getPhone()); }2.2.深拷贝的实现方式 深拷贝的实现有两种方式一种是通过递归来拷贝既然一次拷贝对于引用变量来说只能拷贝地址那就再把引用变量也做一次拷贝就可以了只是这种方式太麻烦了。我们一般会选择第二种方式通过序列化与反序列化来完成对象的拷贝。 其实在我们常见的RPC通信中就是使用的这种方式来完成对象拷贝的请求方将对象序列化成流、字节数组、JSON、XML等等方式来做传输接收方收到数据后用同样的方式反序列化成一个新的对象。我们也可以采用这种方式来完成对象的拷贝。 这里使用一个FastJson工具类做了一个简单的封装封装了两个方法拷贝单个对象和拷贝List对象 public class DeepCloneUtil {/*** 克隆单个对象** param source 被克隆的源对象* param targetClazz 克隆目标对象的类型* param T 目标对象泛型* return 克隆模板对象*/public static T T cloneObject(Object source, ClassT targetClazz) {String jsonString JSON.toJSONString(source);return JSON.parseObject(jsonString, targetClazz);}/*** 克隆List对象** param source 被克隆的源对象* param targetClazz 克隆目标对象的类型* param T 目标对象泛型* return 克隆模板对象*/public static T ListT cloneList(List? source, ClassT targetClazz) {String jsonString JSON.toJSONString(source);return JSON.parseArray(jsonString, targetClazz);}}修改一下测试代码 public static void main(String[] args) {User user new User();user.setName(张三);user.setAge(18);user.setPhone(new Phone());User cloneUser DeepCloneUtil.cloneObject(user, User.class);System.out.println(user.getPhone() cloneUser.getPhone()); }此时两个Phone对象就不是同一个对象了这样就完成了深拷贝。 再试试列表拷贝 public static void main(String[] args) {User user new User();user.setName(张三);user.setAge(18);user.setPhone(new Phone());User user1 new User();user1.setName(李四);user1.setAge(19);user1.setPhone(new Phone());ListUser list Arrays.asList(user, user1);ListUser cloneList DeepCloneUtil.cloneList(list, User.class);}可以看到不管是List还是User还是Phone每一个都是不同的对象。 3.结语 本篇主要讲述的是原型模式的概念及其使用并引出了深拷贝与浅拷贝的区别。 不管是从创建对象的性能上考虑还是从开发效率上考虑都可以在合适的时候选择使用原型模式拷贝对象的方式来替代从头开始创建一个新的对象。
http://www.hkea.cn/news/14555560/

相关文章:

  • 上海企业网站建设价格电子购物网站
  • 网站建设方案书简单常用的平面设计软件有哪些
  • 网站制作的前期主要是做好什么工作优化大师的三大功能
  • 网站开发面试问题营销网站四大要素
  • wordpress子目录 多站点淘宝客怎么自己做网站
  • 广告网站做动图怎么做河南省建设厅电话号码是多少
  • 1免费建站网站做网站在什么地方发帖子呢
  • 免费网站建设模版云盘网页编辑表格
  • 企业网站建设哪家便宜请seo的人帮做网站排名
  • 关键词查询网站济宁网站建设制作设计
  • 河北廊坊seo网站建设网站优化wordpress改端口
  • 辽宁建设局网站首页网站建设技术分析
  • 一般网站自己可以做播放器吗wordpress主题放在哪个文件夹
  • 创建网站得花多少钱电子商务网站建设原则
  • golang建设网站东莞网站优化软件
  • 深圳网站建设公司服务商网站的管理与维护
  • 杭州优化网站广州移动网站开发
  • dw外部网站链接怎么做net做网站
  • 电子商务网站开发要学什么哪里有服务好的网站建设
  • 许昌住房和城乡建设局网站中卫网站推广软件
  • 建设基金会网站百度查找相似图片
  • 怎样查网站和增加网站为什么自己做的网站别人打不开
  • 厦门旅游攻略湖南sem优化
  • 网站开发高级证深圳品牌网站制作多少钱
  • 做网站如何将一张图片直接变体优化设计数学
  • 网站开发就业前景分析天津高端网站设计公司
  • 单位网站建设注意事项网页源代码快捷键
  • 实时视频网站怎么做wordpress登录 不了
  • 简述电子商务网站建设的主要步骤足彩网站建设
  • php网站开发师条件h5如何制作