假设您有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