2009-05-16 36 views
30

Java在實用程序類(具有靜態方法的類)和Service類(具有提供「服務」的公共方法的類)之間有什麼區別。例如,人們可以爭辯說,一個加密對象(提供加密,解密,散列或獲取salt值的方法)是一個服務提供者,但許多組將這個功能組合到具有靜態方法的Utility類中,如CryptoUtil.encrypt(.. )。我試圖弄清楚哪種方式更符合「設計」。思考?Java實用程序類與服務

回答

19

不同的行爲,可以通過使用不同的服務對象來獲得。工具類中的靜態方法不能被換出。這對測試,更改實現和其他目的非常有用。

例如,您使用encrypt方法提及CryptoUtil。如果有不同的對象可以支持不同的加密策略,不同的消息接收者等,這將非常有用。

7

區別在於服務類可能有狀態。而我所說的狀態是指交談狀態。考慮一個名義上的訂購系統。

interface OrderSystem { 
    void login(String username, String password); 
    List<Item> search(String criteria); 
    void order(Item item); 
    void order(Item item, int quantity); 
    void update(Item item, int quantity); 
    void remove(Item item); 
    void checkout(); 
    Map<Item, Integer> getCart(); 
    void logout(); 
} 

這樣的事情可能有狀態會話bean來完成(作爲一個例子),但在這種情況下,認證可能會被覆蓋了傳統的EJB機制。

這裏的要點是會話狀態在於一次調用的結果影響後續調用。您可以將靜態方法視爲一組本地執行的簡單無狀態服務。

服務具有包括更廣泛的含義,但不限於,存在:

  • 狀態;
  • remote;和
  • 實施依賴(即通過一個接口)。

我認爲最好的做法是簡單地使用靜態方法作爲便捷方法(尤其是給定Java缺乏擴展方法)。服務比這更豐富。

+1

靜態變量將保留靜態類的狀態。不是說我鼓勵靜態類 - 我只是在說... – 2009-05-16 02:57:26

+2

我在靜態狀態下看到的大多數類都是我稱之爲'我希望我是單身'的模式的例子。 – 2009-05-16 03:32:14

+0

靜態類中的靜態是我瞭解(如果不是最好的)進入併發問題驚人世界的最佳方式之一。只是在說'... – 2010-12-13 12:18:09

0

我認爲沒有硬性規定。

我通常使用靜態方法來獲得需要很少參數的功能,並且可以在單個方法調用中完成。例如:

  • 計算哈希值的字符串
  • 轉換日期標準表示

如果功能需要很多參數,如果有正創建了一些相關的結果,那麼它更實際上有一個類可以接受它的構造函數中的共享參數,以及幾種執行實際操作的方法。

典型的例子:一個數據庫連接,你先連接,然後用做查詢,然後用得到的結果...

0

我以前在什麼地方在這裏回答了這個問題,但我發現,這是很容易改變一個服務的行爲 - 將它重構爲多個服務 - 它需要一個相當顯著重構,如果您使用靜態類。

如果這是唯一的區別(我相信它),那麼使用靜態類永遠沒有任何意義。

任何時候有人說「永遠不會超過1個這樣的」,代碼爲n個。

3

你不能重載靜態方法,如果你想以兩種不同的方式實現你的服務並在它們之間切換,這可能是一個巨大的問題。出於這個原因,我將靜態工具類的用途限制在「永不」(對於「永不」:)足夠長的值)中的簡單事情需要以多種方式完成。

相關問題