Java &引用;多尔",;类与静态实用程序方法
假设您有一个带有Java &引用;多尔",;类与静态实用程序方法,java,oop,Java,Oop,假设您有一个带有read方法的FileReader类 我理解类级属性可以证明拥有一个实例是合理的。但是,通过将这些相同的属性拉入相应的静态读取方法的范围内,停止生成等效的ReaderUtils类是什么 简言之,对于静态实用程序方法,“Doer”类究竟有何正当理由?接口不能静态实现-接口的实现方法必须是实例方法。因此,这禁止将“实用程序类”作为运行时实现来执行某些服务,或将其作为运行时实现进行查找-它必须是类的实例。这是“doer”类存在的主要原因之一 如果实现在编译时已知,那么实用程序类就可以了
read
方法的FileReader
类
我理解类级属性可以证明拥有一个实例是合理的。但是,通过将这些相同的属性拉入相应的静态
读取
方法的范围内,停止生成等效的ReaderUtils
类是什么
简言之,对于静态实用程序方法,“Doer”类究竟有何正当理由?接口不能静态实现-接口的实现方法必须是实例方法。因此,这禁止将“实用程序类”作为运行时实现来执行某些服务,或将其作为运行时实现进行查找-它必须是类的实例。这是“doer”类存在的主要原因之一
如果实现在编译时已知,那么实用程序类就可以了,而作为静态方法,它们更可能是自然无状态的(只需确保任何静态字段都是不可变/无状态的),这是并发服务请求的典型服务器所需的。这是首选项。一般来说,Java偏爱名词(因为人们觉得这更像是面向对象的),因此FileReader
正如Jeffrey所指出的,有时名词困扰会导致不必要的冗长,此时调用会被包装在静态方法中。OOP的本质是封装状态/数据以及相关的行为。静态实用程序方法类似于过程语言中的全局函数——您将行为(静态方法)与状态(此方法的参数)分离,从而破坏封装 这在实践中意味着什么?您必须调用
ReaderUtils.read()
,而不是调用ReaderUtils.read(file)
,这意味着您现在与实现紧密耦合——您已经做了一个隐式假设,即您将始终使用ReaderUtils
,并始终传入一个文件
如果您改为使用通用
阅读器
界面,您今天可以使用文件阅读器
,但明天可以将其换成数据库阅读器
或HttpReader
,而无需更改任何其他代码——所有阅读器。read()
调用将继续工作。没有什么能阻止任何人制作等效的ReaderUtils
,事实上,它是在JRE中实现的:。不是100%相关,但这提醒我人们是多么喜欢Java中的工厂。。。