假設您有FileReader
類,並且有read
方法。「Do-er」類與靜態效用方法
我明白,類級屬性可以證明有一個實例。然而,通過在相應的方法範圍內拉取這些相同的屬性,什麼在停止製作等效的ReaderUtils
類?
總之,究竟是什麼證明了一個關於靜態效用方法的「Doer」類?
假設您有FileReader
類,並且有read
方法。「Do-er」類與靜態效用方法
我明白,類級屬性可以證明有一個實例。然而,通過在相應的方法範圍內拉取這些相同的屬性,什麼在停止製作等效的ReaderUtils
類?
總之,究竟是什麼證明了一個關於靜態效用方法的「Doer」類?
OOP的本質是封裝狀態/數據以及相關的行爲。靜態工具方法類似於過程語言中的全局函數 - 您將行爲(靜態方法)從狀態(參數傳遞給此方法)分離,從而破壞封裝。
這是什麼意思在實踐中?您不得不打電話給reader.read()
,您必須致電ReaderUtils.read(file)
,這意味着您現在與實施緊密耦合 - 您已經暗示了您將始終使用ReaderUtils
並始終傳遞文件。
如果改爲使用通用Reader
界面,你可以用今天FileReader
但將其交換出去DatabaseReader
或明天HttpReader
,而無需更改任何其他代碼 - 所有reader.read()
通話將繼續工作一樣。
這是一個偏好問題。一般來說,Java支持名詞(因爲人們覺得這是更多的OO)因此FileReader。
正如傑弗裏指出的那樣,有時候名詞的迷戀會導致不必要的冗長,在這一點上調用會被靜態方法包裝。
不是100%相關,但這讓我想起人們如何在Java中如此熱愛工廠...... http://ws.apache.org/xmlrpc/apidocs/org/apache/xmlrpc/server/RequestProcessorFactoryFactory – Mehrdad
沒有任何東西阻止任何人制作等價的'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