小架構step系列18:工具

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/91646.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/91646.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/91646.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

網絡、CentOS 系統、數據庫面試知識點總結

文章目錄Linux CentOS 面試知識點整理速查復習? 一、Linux 高頻面試題? 二、MySQL 高頻面試題? 三、計算機網絡(OSI四層模型)高頻面試題🔗 鏈路層(Link Layer)🌐 網絡層(Internet Layer&…

Vue (Official) v3.0.2 新特性 為非類npm環境引入 globalTypesPath 選項

目錄 前言 報錯信息 原因 解決方案 總結 前言 在早上更新了vscode后,發現自己 uni-app 項目的 .vue文件 的 template 標簽都出現了報錯。定位到了問題是因為 Vue (Official) 插件更新導致的,重裝了插件的上一個小版本,報錯消失&#xff…

程序可能的輸出

#include "csapp.h"int main() {int x 3;if (Fork() ! 0)printf("x%d\n", x);printf("x%d\n", --x);exit(0); }分析:父進程先執行printf("x%d\n", x); 輸出x4。后執行 printf("x%d\n", --x);輸出x3。子進程只執…

2025年UDP應用抗洪指南:從T級清洗到AI免疫,實戰防御UDP洪水攻擊

一次未防護的UDP暴露,可能讓日活百萬的應用瞬間癱瘓,損失超千萬2025年,隨著物聯網僵尸網絡規模指數級增長及AI驅動的自適應攻擊工具泛濫,UDP洪水攻擊峰值已突破8Tbps,單次攻擊成本卻降至50元以下。更致命的是&#xff…

centos7安裝MySQL8.4手冊

目錄前言一、首先更新插件,并查看當前系統版本二、安裝步驟1、創建mysql目錄2、安裝rpm包3、安裝 mysql-community-server4、啟動MySQL服務5、查看MySQL狀態6、設置開機自啟動三、查看默認密碼四、登錄mysql五、修改密碼六、開啟遠程訪問1. 修改 MySQL 配置文件2. 重…

人臉檢測算法——SCRFD

SCRFD算法核心解析 1. 算法定義與背景 SCRFD(Sample and Computation Redistribution for Efficient Face Detection)由Jia Guo等人于2021年在arXiv提出,是一種高效、高精度的人臉檢測算法,其核心創新在于: 雙重重分…

vue3+ts+elementui-表格根據相同值合并

代碼<div style"height: auto; overflow: auto"><el-table ref"dataTableRef" v-loading"loading" :data"pageData" highlight-current-row borderselection-change"handleSelectionChange" :span-method"obj…

UI前端與數字孿生融合案例:智慧城市的智慧停車引導系統

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!一、引言&#xff1a;停車難的 “城市痛點” 與數字孿生的破局之道當司機在商圈繞圈 30 分鐘仍…

java+vue+SpringBoot集團門戶網站(程序+數據庫+報告+部署教程+答辯指導)

源代碼數據庫LW文檔&#xff08;1萬字以上&#xff09;開題報告答辯稿ppt部署教程代碼講解代碼時間修改工具 技術實現 開發語言&#xff1a;后端&#xff1a;Java 前端&#xff1a;vue框架&#xff1a;springboot數據庫&#xff1a;mysql 開發工具 JDK版本&#xff1a;JDK1.8 數…

【Docker基礎】Docker-compose從入門到精通:安裝指南與核心命令全解析

目錄 前言 1 Docker-compose核心概念解析 1.1 什么是Docker-compose&#xff1f; 1.2 典型應用場景 2 Docker-compose離線安裝詳解 2.1 離線安裝背景與優勢 2.2 詳細安裝步驟 步驟1&#xff1a;獲取離線安裝包 步驟2&#xff1a;文件部署與權限設置 步驟3&#xff1a…

面試150 被圍繞的區域

思路 使用DFS&#xff0c;將所有與邊界相連的’O’都修改為‘#’,然后遍歷數組&#xff0c;如果是遇到’#‘修改為’O’,如果是’O’修改為’X’。 class Solution:def solve(self, board: List[List[str]]) -> None:"""Do not return anything, modify boar…

(數據結構)線性表(上):SeqList 順序表

線性表&#xff08;上&#xff09;&#xff1a;Seqlist 順序表基本了解線性表順序表靜態順序表動態順序表編寫動態順序表項目結構基礎結構初始化尾插頭插尾刪頭刪查找指定位置pos之前插入數據刪除指定位置pos的數據銷毀完整代碼SeqLIst.hSeqLIst.ctest.c算法題移除元素刪除有序…

WebStorm vs VSCode:前端圈的「豆腐腦甜咸之爭」

目錄 一、初識兩位主角&#xff1a;老司機與新勢力 二、開箱體驗&#xff1a;是「拎包入住」還是「毛坯房改造」 三、智能提示&#xff1a;是「知心秘書」還是「百度搜索」 四、調試功能&#xff1a;是「CT 掃描儀」還是「聽診器」 五、性能表現&#xff1a;是「重型坦克」…

C#將類屬性保存到Ini文件方法(利用拓展方法,反射方式獲取到分組名和屬性名稱屬性值)

前言&#xff1a;最近學習C#高級課程&#xff0c;里面學到了利用反射和可以得到屬性的特性、屬性名、屬性值&#xff0c;還有拓展方法&#xff0c;一直想將學到的東西利用起來&#xff0c;剛好今天在研究PropertyGrid控件時&#xff0c;想方便一點保存屬性值到配置文件&#xf…

kafka 單機部署指南(KRaft 版本)

目錄環境準備JDK安裝下載jdkjdk安裝kafka 部署kafka 下載kafka 版本號結構解析kafka 安裝下載和解壓安裝包配置 KRaft 模式格式化存儲目錄啟動kafkaKafka 配置為 systemd 服務注意事項調整 JVM 內存參數Kafka KRaft 版本&#xff08;即 Kafka 3.0 及更高版本&#xff09;使用 K…

websocket案例 599足球比分

目標地址:aHR0cHM6Ly93d3cuNTk5LmNvbS9saXZlLw接口:打開控制臺 點websocket 刷新頁面 顯示分析:不寫理論了關于websocket 幾乎發包位置都是下方圖片 不管抖音還是快手 等平臺這里在進行 new WebSocket 后 是要必須走一步的 也就是 new WebSocket().onopen() 也就是onopen 進行向…

【后端】Linux系統發布.NetCore項目

目錄 1.設置全球化不變模式 1.發布到文件 3. 配置為服務 3.1.添加服務 3.2.添加執行權限 3.3.啟動服務 4.訪問 1.設置全球化不變模式 雙擊所需項目&#xff0c;設置全球化不變模式 <!-- 設置全球化不變模式 --><RuntimeHostConfigurationOption>System.Globa…

CMU-15445(2024fall)——PROJECT#0

題目介紹 這是題目原文。 注意&#xff1a;在拉取項目的時候需要注意拉取2024fall的Tag&#xff0c;本人血淚教訓&#xff01; 本題是關于HyperLogLog的具體實現&#xff0c;其介紹可以看這個視頻進行了解。簡單來說HyperLogLog可以在一個非常小的固定內存下&#xff08;一般…

使用微信免費的圖像處理接口,來開發圖片智能裁剪和二維碼/條碼識別功能,爽歪歪

大家好&#xff0c;我是小悟。 1、圖片智能裁剪 我們先來了解一下圖片智能裁剪。圖片智能裁剪聚焦于數字圖像的智能化處理。AI技術的引入徹底改變了傳統依賴人工框選的裁剪模式。 通過深度學習模型自動識別圖像主體&#xff08;人物、商品等&#xff09;&#xff0c;能在極短時…

【代碼隨想錄】+ leetcode hot100:棧與隊列算法專題總結、單調棧

大家好&#xff0c;我是此林。 今天分享的是【代碼隨想錄】棧與隊列算法專題總結&#xff0c;分享刷算法的心得體會。 1. 用棧實現隊列、用隊列實現棧 232. 用棧實現隊列 - 力扣&#xff08;LeetCode&#xff09; 225. 用隊列實現棧 - 力扣&#xff08;LeetCode&#xff09;…