2012-08-25 81 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