我是函数式编程的新手。我可能对函数式编程(FP)有误解,但我认为纯FP语言不允许使用可变对象。
我有两个问题。一个是理论上的,另一个是关于具体的Java代码。
问题1 纯FP语言如何避免复制对象的性能开销?
var x = getMassiveObject()
var y = f(x)
我认为x
必须在f
中复制,因为x
是不可变的,没有人无法触及x
的内存空间。如果x
很大,复制过程似乎需要花费很多时间。
但是,我没有读过关于这一点的任何讨论,所以我相信FP语言中没有这种开销。
所以,我的第一个问题是 FP语言如何避免复制不可变巨大对象的开销?
问题2 我想用FP方式构建Java程序以避免副作用。 我的第二个问题是如何重写下面的代码以消除副本的开销?
public void main(){
MassiveClass m = new MassiveClass();
MassiveClass n = convert(m);
}
public MassiveClass convert(MassiveClass arg){
MassiveClass arg2 = deepCopy(arg); // copy arg because arg should not be modified
arg2.var = 100;
return arg2
}
答案 0 :(得分:1)
第一个问题: x
未复制。它传递给函数f
。不变性意味着x
将保持不变,其状态在构造之后不会改变,直到对象的生命周期结束。
第二个问题:为了使对象在Java中不可变,其所有字段都应该是不可变的。如果您将List
作为字段放在MassiveClass
中,则它不再是不可变的。你必须做好防御性复制。