【发布时间】:2024-04-15 09:35:02
【问题描述】:
如果我们考虑一个函数 foo 取决于 a 和 b。然后我会写一个无状态函数如下:
MyClass
final b;
<returnType> foo(a) {...}
我问是因为 foo 将取决于 MyClass 对象的状态。但是,该状态是最终状态,因此 foo 将始终为给定的 a 返回相同的结果。
以教条的方式遵循函数范式,即让函数仅依赖于它们的输入/参数,这意味着:
MyClass
<returnType> foo(a, b) {...}
然而,foo 可以被设为静态。那么,函数式风格的教条式应用总是会导致静态方法吗?
谢谢!
【问题讨论】:
-
如果
b是最终的,它可以在foo中使用,而无需添加它作为参数。它不会改变。无论您有x -> x * PI还是x -> x * 3.14,如果PI = 3.14差别不大,它永远不会不同。 -
您可以将实例方法中的
this(在引用b字段时显式编写或暗示)视为第一个参数foo。这就是它在字节码中的工作方式。这取决于你的真实想法,以及你认为什么是“教条”。根据意见投票结束。 -
"那么,函数式风格的教条式应用总是会导致静态方法吗?" 是的,但那是因为 OOP 不能很好地建模函数式方法。
static在 OO 设计中的位置有点奇怪,因为它承认不仅对象及其状态很重要。而函数式编程完全接受了这一点,所以技术上如果您要通过 OO 来表示 FP,那么几乎所有方法都应该是静态的。但那是因为 Java(真的)没有免费函数。 -
@VLAZ 谢谢。如果 b 不是像 PI 这样的常数值,那也没关系,对吧?重要的是它是不可变的。这意味着,我可以用一些 b 实例化 MyClass,然后就可以了?
-
轻微警告:仅仅因为一个字段是
final并不意味着它代表一个常量值。一个非常明显的例子是final List<String> x:虽然您不能将 不同List对象重新分配给x,但List的 content 可以其实改变!对于真正的常量值,您需要bothfinal字段和不可变类型(例如String)。
标签: java functional-programming static stateless