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 -&gt; x * PI 还是x -&gt; x * 3.14,如果PI = 3.14 差别不大,它永远不会不同。 您可以将实例方法中的this(在引用b 字段时显式编写或暗示)视为第一个参数foo。这就是它在字节码中的工作方式。这取决于你的真实想法,以及你认为什么是“教条”。根据意见投票结束。 "那么,函数式风格的教条式应用总是会导致静态方法吗?" 是的,但那是因为 OOP 不能很好地建模函数式方法。 static 在 OO 设计中的位置有点奇怪,因为它承认不仅对象及其状态很重要。而函数式编程完全接受了这一点,所以技术上如果您要通过 OO 来表示 FP,那么几乎所有方法都应该是静态的。但那是因为 Java(真的)没有免费函数。 @VLAZ 谢谢。如果 b 不是像 PI 这样的常数值,那也没关系,对吧?重要的是它是不可变的。这意味着,我可以用一些 b 实例化 MyClass,然后就可以了? 轻微警告:仅仅因为一个字段是final 并不意味着它代表一个常量值。一个非常明显的例子是 final List&lt;String&gt; x:虽然您不能将 不同 List 对象重新分配给 x,但 Listcontent 可以其实改变!对于真正的常量值,您需要both final 字段和不可变类型(例如 String)。 【参考方案1】:

根据确切的术语,您可以说函数式风格的教条式应用程序总是会导致静态方法。但是,在我看来,教条地遵循某种风格总是一个坏主意。

我想说,在像 Java 这样的面向对象编程语言中,每个方法都有一个隐含的附加参数,其中包含 this 引用,即对调用该方法的对象的引用。如果采用这种观点,那么调用非静态方法仍然是“函数式”。

请注意,您甚至不能调用简单的 getter,否则。

【讨论】:

“所有的绝对都是坏的”;-)

以上是关于Java中的无状态函数的主要内容,如果未能解决你的问题,请参考以下文章

Web中的无状态含义

Wicket 中的无状态模态对话框

Blazor中的无状态组件

http的无状态无连接

SOA 的无状态 ORM

JWT 令牌中的无状态身份验证和权限