- 工具类网站
1.1 定义
工具类是为了提供一些通用的、某一非业务领域内的公共方法,不需要配套的成员变量,仅仅是作为工具方法被使用。所以将它做成静态方法最合适,不需要实例化,能够获取到方法的定义并调用就行。
1.2 不实例化的原因
如果要实例化一个工具类,就需要一定的内存空间,工具类提供的是静态方法,通过类就能调用,所以不必浪费内存去实例化工具类对象。
1.3 做法
Java项目中使用的工具类非常多,比如JDK自己的工具类java.lang.Math、java.util.Collections等都是我们经常用到的,,而且JDK也做了很好的处理,由于不希望被初始化,于是就。我们来看一下java.lang.Math代码:
这在平台型或框架型项目中已经足够了。但是如果已经告诉你不能这么做了,你还要生成一个Math实例来访问静态方法和属性(J),那我就不保证正确性了,隐藏问题随时都有可能爆发!那我们在项目开发中有没有更好的限制办法呢?有,即不仅仅设置成private访问权限,还抛异常,代码如下:
。需要注意一点的是,此工具类最好不要做继承的打算,因为如果子类可以实例化的话,那就要调用父类的构造函数,可是父类没有可以被访问的构造函数,于是问题就会出现。
总结:在使用私有构造器的基础下,再在构造方法中返回一个异常,因为虽然外部类无法实例化该类,但是内部类可以实例化该类。如果只是通过私有化构造器,那么通过反射的方式,还是可以实例化该类,因此,必须在私有构造器中添加一个异常,这样,当执行构造方法的时候,就会抛出异常,从而停止实例化。
2.1 apache common包 CollectionUtils 使用
- 集合判断: 判断集合是否为空
- 判断集合是否不为空
- 2个集合间的操作:
- 集合a: {1,2,3,3,4,5}
- 集合b: {3,4,4,5,6,7}
使用BeanUtils.copyProperties进行对象之间的属性拷贝
3.1 问题引入
需要将两个不同的对象实例进行属性复制,从而基于源对象的属性信息进行后续操作,而不改变源对象的属性信息,比如DTO数据传输对象和数据对象DO,我们需要将DO对象进行属性复制到DTO,但是对象格式又不一样,所以我们需要编写映射代码,将对象中的属性值从一种类型转换成另一种类型。这种转换最原始的方式就是手动编写大量的 ,当然这是我们开发过程不愿意去做的,因为它确实显得很繁琐。为了解决这一痛点,就诞生了一些方便的类库,常用的有 ,,
3.2 前置知识
如果在拷贝这个对象的时候,只对基本数据类型进行了拷贝,而对引用数据类型只是进行引用的传递,而没有真实的创建一个新的对象,则认为是浅拷贝。反之,在对引用数据类型进行拷贝的时候,创建了一个新的对象,并且复制其内的成员变量,则认为是深拷贝。
- 浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝
- 深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。
3.3 BeanUtils
BeanUtils组件是用于简化javaBean的操作,那么什么是javaBean呢?简单来说,。javaBean的特点:
- 必须具有一个无参的构造方法
- 属性必须私有化
- 私有化的属性必须通过public类型的方法来暴露,也就是说要出现setXXX()、getXXX()或者isXXX()的方法
BeanUtils用法
- 对象的拷贝,BeanUtils.copyProperties(Object dest,Object orig)
- 对象属性的拷贝,BeanUtils.copyProperties(Object bean,String name,Object value)或BeanUtils.setProperty(Object bean,String name,Object value)
- map数据封装到Javabean,populate(Object bean, Map<String,? extends Object> properties)
注意事项:
- target的属性必需要有set方法,否则该属性不会被拷贝
- 使用 org.springframework.beans.BeanUtils 包下的BeanUtils,不要使用apache包下的,apache包下的BeanUtils效率低,已不推荐使用
- 如果source与target中存在属性名相同类型不同的情况,则target中对应的属性值为null
- 如果target中不存在source中含有的属性,则丢弃source中该属性的值
3.3.1 Apache 的 BeanUtils
Apache 的 BeanUtils 对于对象拷贝加了很多的检验,包括类型的转换,甚至还会检验对象所属的类的可访问性,可谓相当复杂,这也造就了它差劲的性能,在Java开发手册中也提到尽量避免使用Apache 的 BeanUtils 工具类。
Apache里面的BeanUtils组件使用:
3.3.2 Spring 的 BeanUtils
Spring的BeanUtils也是使用 copyProperties方法进行拷贝,只不过它的实现方式非常简单,就是对两个对象中相同名字的属性进行简单的get/set,仅检查属性的可访问性。
- PersonDest.java
- PersonSource.java
- PersonSpringBeanUtils.java
3.3.3 总结
- 以上简要的分析两种BeanUtils,因为Apache下的BeanUtils性能较差,不建议使用,可以使用 Spring的BeanUtils,
- 区别
https://blog.csdn.net/weixin_/article/details/
3.4 BeanUtils是浅拷贝
- 链接
- 浅谈BeanUtils的拷贝,深度克隆
结论:
- 1、BeanUtils的copyProperties()方法并不是完全的深度克隆,在包含有引用类型的对象拷贝上就可能会出现引用对象指向同一个的情况,且该方法的性能低下,项目中一定要谨慎使用。
- 2、要实现高性能且安全的深度克隆方法还是实现Serializable接口,多层克隆时,引用类型均要实现Serializable接口。
- YTTLJ_Father.java
- YTTLJ_Life.java
- YTYLJ_Son.java
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/bcyy/15747.html