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

时间:2018-02-05 12:01:25

标签: oop state

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

2 个答案:

答案 0 :(得分:1)

例如,如果您想在OOP术语中使用所谓的“策略模式”。

例如,如果您正在编写一个小计算器,并且想要对堆栈顶部的两个数字应用二进制运算,则需要将用户输入映射到类Addition的实例,{ {1}},...,Subtraction,它们都实现了接口Division并且拥有(无状态!)方法BinaryOperator

基本算术运算int apply(int firstArg, int secondArg)+-*与任何可能获得的一样无状态,但是,您仍然将它们附加到类的实例

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

答案 1 :(得分:1)

请记住:根据所使用的语言/技术, static 几乎可以是一种反模式。

例如,在Java中, static 以基本上杀死多态的方式实现。但多态是OOP的基石之一。您可以使用它来轻松添加新功能 - 通过扩展某些类和覆盖某种方法。但是当使用 static 时,你直接"链接"你自己去了那个非常具体的类和方法实现。如果您需要不同的行为,则可以

  • 更改调用者以调用某些其他方法
  • 更改该静态方法的行为。

当然:再次,在Java中,为了进行适当的单元测试, static 可以快速地阻挡你。大多数情况下,当人们发现" woha时,我的测试代码会调用静态方法,并且调用静态方法会调用我们的单元测试环境" - 他们的答案"是转向允许模拟静态方法的模拟框架(如PowerMock或JMockit)。这可能会导致其他问题。

因此: static 有它的位置,但是根据你的技术堆栈你应该非常小心使用它。 没有状态可能因此是必要的,但在确定某个方法是否应 static 时是否足够