2012-08-25 117 views
7

假設您有FileReader類,並且有read方法。「Do-er」類與靜態效用方法

我明白,類級屬性可以證明有一個實例。然而,通過在相應的方法範圍內拉取這些相同的屬性,什麼在停止製作等效的ReaderUtils類?

總之,究竟是什麼證明了一個關於靜態效用方法的「Doer」類?

+4

沒有任何東西阻止任何人制作等價的'ReaderUtils',事實上,它是在JRE中實現的:['Files.readAllLines'](http://docs.oracle.com/javase/7/docs/api /java/nio/file/Files.html#readAllLines%28java.nio.file.Path,%20java.nio.charset.Charset%29)。 – Jeffrey

回答

2

OOP的本質是封裝狀態/數據以及相關的行爲。靜態工具方法類似於過程語言中的全局函數 - 您將行爲(靜態方法)從狀態(參數傳遞給此方法)分離,從而破壞封裝。

這是什麼意思在實踐中?您不得不打電話給reader.read(),您必須致電ReaderUtils.read(file),這意味着您現在與實施緊密耦合 - 您已經暗示了您將始終使用ReaderUtils並始終傳遞文件。

如果改爲使用通用Reader界面,你可以用今天FileReader但將其交換出去DatabaseReader或明天HttpReader,而無需更改任何其他代碼 - 所有reader.read()通話將繼續工作一樣。

2

接口不能靜態實現 - 接口的實現方法必須是實例方法。因此,這禁止injectionJNDI查找「實用程序類」作爲執行某些服務的運行時實現 - 它必須是一個類的實例。這是「幹員」班存在的主要原因之一。

如果實現在編譯時已知,並且是靜態方法,它們更可能自然地成爲無狀態(只要確保任何靜態字段是不可變的/無狀態的),實用程序類就可以了,這是典型的服務器所需的同時申請。

1

這是一個偏好問題。一般來說,Java支持名詞(因爲人們覺得這是更多的OO)因此FileReader。

正如傑弗裏指出的那樣,有時候名詞的迷戀會導致不必要的冗長,在這一點上調用會被靜態方法包裝。

+1

不是100%相關,但這讓我想起人們如何在Java中如此熱愛工廠...... http://ws.apache.org/xmlrpc/apidocs/org/apache/xmlrpc/server/RequestProcessorFactoryFactory – Mehrdad