gpt4 book ai didi

java - 如何防止 Java 中对象的状态发生变化(相对于 FP)?

转载 作者:太空宇宙 更新时间:2023-11-04 14:17:03 25 4
gpt4 key购买 nike

想象我有这样的方法:

public int doSomething(String value)
{
this.value = value
//calculation
//based on value return the op
return op;
}

此方法确实会更改对象的状态。当我在看书的时候FP In Scala作者说,在这种情况下,我们需要将新状态与新对象一起返回。像这样的事情:

public List<Integer,AnClass> doSomething(String value)
{
AnClass obj = new AnClass();
obj.value = value
//calculation
//based on value return the op
//return List of op,new AnClass
}

原因是,doSomething是一个副作用方法,它确实会修改对象的状态。相反,修订版本确实创建了一个新对象,并且不会更改旧对象的

对此,我有几个问题:

  1. 想象一下 AnClass 有大量实例变量,如果要将它们全部复制到一个新对象中,我应该怎么做?

  2. 我们不应该像作者所说的那样改变对象的状态总是好的吗?在这种情况下,我们需要采取类似的方法,就像我上面所做的那样?

  3. 如果我们继续创建 java 对象,不会使用大量堆内存吗?这会降低我的应用程序速度吗?

最佳答案

  1. 深层浅层文案是您要寻找的流行语。有几个线程讨论如何在 Java 中正确执行此操作。使用哪一种取决于类结构。你能保证类中包含的每个变量都是不可变的吗?如果是这样,请选择浅复制。如果不是,你别无选择,只能选择更昂贵的深拷贝。

  2. 函数式编程作为一种范例可以在副作用或并行化方面为您省去很多麻烦。如果您预计 future 会出现副作用或即将修复一些问题,我建议您使用它。但这取决于用例,有时一点点可变性会更干净、更高效。这实际上是关于你作为一名程序员了解 FP 范式并能够将其应用到适当的案例中。在我看来,你的做法看起来不太干净。我会看看 Java 的浅复制方法,正如我在 1 中指出的那样。然后,您应该能够在通过构造函数应用新的 value 的同时复制 AnClass它。正如您在代码中指出的那样,您不应该能够更改 obj.value ,它必须是私有(private)的。之后,您可以调用 public int doSomething(AnClass CopyImmutableInstance) 方法。也就是说,不知道代码的整个上下文。

  3. 是的,但这实际上取决于您使用深复制还是浅复制。后一种影响应该不会像前一种那样大。

最后我想说,Java 最初并不是为函数式编程而设计的。它最近肯定获得了更多的函数式特性,但你很难用这种语言实现纯函数式。

关于java - 如何防止 Java 中对象的状态发生变化(相对于 FP)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27595820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com