1 概述
在写代码的时候,有很多通用的、与业务无关逻辑,这些一般写成工具类方法。这些工具类方法慢慢地被积累起来,变成了开源包,可以直接使用开源包,而不是自己再花时间来重复造这些轮子。
这些工具类的开源包比较多,公司如果没有控制的话,不同的开发人员就会选自己熟悉的开源包,甚至都拿来练练手。这样的后果就是,在一个工程内使用了五花八门的工具类包,维护代码的时候不好维护,如果要升级一些框架包或者扫描漏洞,发现很多包都需要升级或者更改,处理起来工作量比较大。
故对于公司来说,应该限定一下工具类包的种类,选定符合公司情况的工具类包。
2 工具类包
2.1 常用的工具类包
包名 |
说明 |
Apache Commons |
集合操作、字符串操作、日期处理、文件处理、编码和解码、各种验证器等操作,种类是比较丰富的,需要什么类型的操作就引对应的依赖包。参考文档:https://commons.apache.org/ |
Spring和JDK提供的Util类 |
零零散散有一些(比如字符串、文件等操作),好处是不用额外引包,缺点是场景有限,比较零散也不好找。 |
Google Guava |
有字符串操作、集合操作、对象比较、数学计算、反射等基础操作,还提供了图、缓存、并发、函数等有特色的工具方法,有对特色部分有需求的可优先选用。参考文档:https://github.com/google/guava/wiki |
Hutool |
小而全,覆盖大部分场景,没有依赖其它开源包,非常的轻量,也很好用,缺点是没有社区的维护,有停止维护的风险。参考文档:https://doc.hutool.cn/pages/index/ |
本文选Hutool来说明,该工具属于个人维护的,并没有大公司背后支持,根据公司情况选用。
2.2 Hutool常用工具类
下面只是摘录一些常用的接口,Hutool提供了很丰富的工具类方法,更多方法可参考文档说明:https://doc.hutool.cn/pages/index/
2.2.1 对象操作
cn.hutool.core.bean.BeanUtil
把对象转为Map:Map beanToMap(Object bean)
拷贝对象属性:void copyProperties(Object source, Object target, boolean ignoreCase)
获取指定属性值:Object getFieldValue(Object bean, String fieldNameOrIndex)
把map转成对象:T mapToBean(Map map, Class beanClass, boolean isIgnoreError)
把对象拷贝成指定类型对象:T toBean(Object source, Class clazz)
2.2.3 数组操作
cn.hutool.core.util.ArrayUtil
判断数组是否为空:boolean isEmpty(Object array)
给数组增加元素:Object append(Object array, T... newElements)
拷贝数组部分元素:Object copy(Object src, int srcPos, Object dest, int destPos, int length)
获取数组长度:int length(Object array)
把集合转为数组:T[] toArray(Collection collection, Class componentType)
2.2.4 集合操作
cn.hutool.core.collection.CollectionUtil
判断是否包含元素:boolean contains(Collection collection, Object value)
创建空集合:T empty(Class collectionClass)
判断集合是否为空:boolean isEmpty(Collection collection)
对集合元素进行排序:List sort(Collection collection, Comparator comparator)
数组转集合:ArrayList toList(T... values)
2.2.5 字符串操作
cn.hutool.core.util.StrUtil
判断字符串是否为空:boolean isEmpty(CharSequence str)
判断字符串是否包含子串:boolean contains(CharSequence str, CharSequence searchStr)
trim字符串:String trim(CharSequence str)
拆分字符串:String[] split(CharSequence str, CharSequence separator)
拆分并trim字符串:List splitTrim(CharSequence str, CharSequence separator)
把字符串转成驼峰型:String toCamelCase(CharSequence name)
2.2.6 日期操作
cn.hutool.core.date.DateUtil
格式化字符串:String format(Date date, String format)
把字符串解析为日期对象:DateTime parse(CharSequence dateStr, String format)
取指定日期的月:int month(Date date) 同理可以取时分秒、年月日、周等
取指定日期同月的第一天:DateTime beginOfMonth(Date date)
取指定日期同月的最后一天:DateTime endOfMonth(Date date)
取两个日期之间的差值:long between(Date beginDate, Date endDate, DateUnit unit)
判断是否闰年:boolean isLeapYear(int year)
变更日期:DateTime offset(Date date, DateField dateField, int offset)
2.2.7 文件操作
cn.hutool.core.io.FileUtil
创建文件:File newFile(String path)
拷贝文件:File copy(File src, File dest, boolean isOverride)
移动文件:void move(File src, File dest, boolean isOverride)
列出目录下的文件:File[] ls(String path)
判断是否是文件:boolean isFile(File file)
读文本文件行为List:List readLines(File file, Charset charset)
写文本文件:File writeLines(Collection list, File file, Charset charset)
获取文件大小:long size(File file)
判断是否是目录:boolean isDirectory(File file)
创建目录:File mkdir(File dir)
创建父目录:File mkParentDirs(File file)
2.2.8 HTTP操作
cn.hutool.http.HttpUtil
发GET请求: String get(String urlString, Map paramMap)
发POST请求:String post(String urlString, Map paramMap)
下载文件:long downloadFile(String url, File destFile)
cn.hutool.json.JSONUtil
格式化JSON字符串:String formatJsonStr(String jsonStr)
把JSON字符串转成对象:T toBean(String jsonString, Class beanClass)
把JSON字符串转成List:List toList(String jsonArray, Class elementType)
把对象转为JSON字符串:String toJsonStr(Object obj)
2.2.9 加解密操作
cn.hutool.crypto.SecureUtil
散列成MD5字符串:String md5(String data)
散列成SHA1字符串:String sha1(String data)
散列成SHA256字符串:String sha256(String data)
AES加密:AES aes(byte[] key)
RSA加密:RSA rsa(String privateKeyBase64, String publicKeyBase64)
对参数签名:String signParamsSha256(Map params, String... otherParams)
注:感觉这块封装得不够完善,可以当基础方法进一步封装。
3 架构一小步
1、确定工具类,如Hutool、guava。
2、积累公司自身的工具类包(涵盖外部工具类不涉及的部分或者扩展的部分)。
3、应定期调研工具类包和收集工具类包的需求,根据需要扩展。
4、规范:只允许使用的工具类包,不要随意引入新的工具类包。