Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 是否存在无状态方法不应是静态的情况?_Oop_State - Fatal编程技术网

Oop 是否存在无状态方法不应是静态的情况?

Oop 是否存在无状态方法不应是静态的情况?,oop,state,Oop,State,由于无状态方法大多标记为静态,因此它们不需要实例。但我想知道是否有一种情况,无状态方法仍然可以是类的实例方法? 我问这个问题的原因是,我读过一些提到“无状态和静态方法”的学习材料,所以我在思考它们之间的区别。例如,如果你想利用OOP术语中所谓的“策略模式” 例如,如果您正在编程一个小型计算器,并且希望对堆栈顶部的两个数字应用二进制操作,那么您希望将用户输入映射到类的实例加法,减法,…,除法,这些类都实现了接口二进制运算符,并且具有(无状态!)方法intapply(intfirstarg,ints

由于无状态方法大多标记为静态,因此它们不需要实例。但我想知道是否有一种情况,无状态方法仍然可以是类的实例方法?
我问这个问题的原因是,我读过一些提到“无状态和静态方法”的学习材料,所以我在思考它们之间的区别。

例如,如果你想利用OOP术语中所谓的“策略模式”

例如,如果您正在编程一个小型计算器,并且希望对堆栈顶部的两个数字应用二进制操作,那么您希望将用户输入映射到类的实例
加法
减法
,…,
除法
,这些类都实现了接口
二进制运算符
,并且具有(无状态!)方法
intapply(intfirstarg,intsecondarg)

基本算术运算
+
-
*
/
都是无状态的,但仍然需要将它们附加到类的实例


这是一个典型的例子,因为当你将OOP与纯函数式编程混合在一起时,没有可变状态的所有对象都会变成类似闭包的集合,这本质上是对甲基苯丙胺的好的旧OOP策略。

请记住:根据所使用的语言/技术,静态几乎是一种反静态的策略-模式

例如,在Java中,静态的实现方式基本上可以杀死多态性。但多态性是OOP的基石之一。通过扩展某个类和重写某个方法,您可以使用它轻松地添加新功能。但是使用静态时,您直接“链接”您可以将自己定义为非常特定的类和方法实现

  • 更改调用者以调用其他方法
  • 更改该静态方法的行为
当然,在Java中,为了进行适当的单元测试,静态方法会很快妨碍您。通常,当人们发现“哇哈,我的测试代码调用了静态方法,哎哟,调用我们单元测试环境中出现的静态方法”——他们的“答案”是转向允许模拟静态方法的模拟框架(如PowerMock或JMockit),这可能导致其他问题


因此:静态有它的位置,但取决于您的技术堆栈,您在使用它时应该非常小心。因此,没有状态可能是必要的,但在确定某个方法是否应该是静态的时就足够了。

静态方法不一定是无状态的。它们可能会使用/更改类静态数据。@Mat True,我的意思是说那些人真的没有这样做。