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、規范:只允許使用的工具類包,不要隨意引入新的工具類包。