java工具類編寫思考

sayWhat_sayHello發表於2018-09-06

初衷

這篇部落格的初衷是因為我想寫一個工具類,同時對工具類做出一些規範以及優化。

規範

  1. 工具類定義為final class,考慮到工具類應該不能被繼承
  2. 工具類的命名應該用Util結尾,例如LogUtil
  3. 工具類的構造方法應該首選是private的,同時工具類的工具方法為static
  4. 工具類使用單例模式,或者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(),如果寫個單例,可能全世界都要笑話你了。
如果有配置資訊的工具類,最好還是使用單例模式吧,這樣以後如果有多個資料來源,你會感謝你自己。

區別

我在靜態方法裡使用的單例模式,不是指的是我的工具類作為單例,而是第三方的類。

如有錯誤請指正。

相關文章