java工具類編寫思考
阿新 • • 發佈:2018-10-31
初衷
這篇部落格的初衷是因為我想寫一個工具類,同時對工具類做出一些規範以及優化。
規範
- 工具類定義為
final class
,考慮到工具類應該不能被繼承 - 工具類的命名應該用
Util
結尾,例如LogUtil
- 工具類的構造方法應該首選是
private
的,同時工具類的工具方法為static
的 - 工具類使用單例模式,或者
static
初始化某個單例。這個規範是因工具的不同而不同的,例如我要寫一個gson
的工具類,不應該在每個方法裡都new Gson()
再進行操作,如果一個類大量呼叫GsonUtil
,那就會大量建立gson
物件。
針對第四種,給點示例程式碼,首先是靜態塊初始化方式:
public final class GsonUtil {
private static Gson gson = null;
static {
if (gson == null) {
gson = new Gson();
}
}
private GsonUtil() {
}
}
然後是單例模式初始化方式:
public final class GsonUtil{
private static volatile Gson gson;
private static Gson initInstance (){
if(gson == null){
synchronized(GsonUtil){
if(gson == null){
gson = new Gson();
}
}
}
}
private GsonUtil() {
initInstance();
}
}
拓展
上面是我自己思考的,然後我又看了一些其他資料,主要是說:
編寫工具類倆種方式:
一:
1.工具方法都設為非static方法
2.將工具類設計為單列模式
3.注意這種方式需要獲取工具類物件(例項化)才能呼叫方法
二:
1.工具方法設計為static方法
2.工具 類所有構造方法都設計為private修飾
3.工具類本身以abstract修飾(目的就是隻能用類呼叫方法,不能例項化)
說靜態類好的:
靜態類不用引用就能呼叫,而單例需要有物件的引用,因此節約資源(我覺得這個影響微乎其微,可以忽略)
靜態類方便,隨處可用;而單例必須有引用,需要注入或者new(是有點麻煩,我上次寫靜態類也是因為這個原因)
說單例好的:
單例模式的類是普通的類,它具有面向物件的特性,方便擴充套件
對於有配置的工具類,可以輕鬆的建立多個不同配置的單例物件(想起我主導的另一個專案就存在5-6個redis資料來源,如果使用靜態類就是災難)
因此,得出以下結論:
如果沒有配置資訊的工具類,當然是靜態類好,隨處呼叫,不需引用爽得不要不要的。比如Math.abs(),如果寫個單例,可能全世界都要笑話你了。
如果有配置資訊的工具類,最好還是使用單例模式吧,這樣以後如果有多個數據源,你會感謝你自己。
區別
我在靜態方法裡使用的單例模式,不是指的是我的工具類作為單例,而是第三方的類。
如有錯誤請指正。