Java中的无状态函数
Posted
技术标签:
【中文标题】Java中的无状态函数【英文标题】:Stateless Function in Java 【发布时间】:2021-10-02 05:11:41 【问题描述】:如果我们考虑一个函数 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 可以其实改变!对于真正的常量值,您需要both final
字段和不可变类型(例如 String
)。
【参考方案1】:
根据确切的术语,您可以说函数式风格的教条式应用程序总是会导致静态方法。但是,在我看来,教条地遵循某种风格总是一个坏主意。
我想说,在像 Java 这样的面向对象编程语言中,每个方法都有一个隐含的附加参数,其中包含 this
引用,即对调用该方法的对象的引用。如果采用这种观点,那么调用非静态方法仍然是“函数式”。
请注意,您甚至不能调用简单的 getter,否则。
【讨论】:
“所有的绝对都是坏的”;-)以上是关于Java中的无状态函数的主要内容,如果未能解决你的问题,请参考以下文章