2 回答
TA贡献1788条经验 获得超4个赞
规则是没有副作用。改变一个对象是一个副作用。然而,它并没有真正说你正在变异,所以这里有一个 Payment 版本,其中你的代码是纯的:
public class Payment
{
private int value;
public Payment(int value) {
this.value = value;
}
public Payment setValue(int value) {
return new Payment(value);
}
public int getValue() {
return value;
}
public static int a(Payment payment) {
payment.setValue(payment.getValue() - 1); // dead code
return payment.getValue() * 10;
}
public static int b(Payment payment) {
return payment
.setValue(payment.getValue() - 1)
.getValue() * 10;
}
public static void main(String args[]) {
Payment p = new Payment(10);
System.out.println(String.valueOf(a(p)));
System.out.println(String.valueOf(b(p)));
}
}
请注意您的定义a没有改变,它是 100% 的功能。如果你通过它10它返回100,总是输入的 10 倍。然而,从不使用返回Payment带有值的 new 的第一行,9因此它是死代码。目的可能是我重写的版本,b. b也是功能性的。
现在其他实现Payment可能会产生a和b不纯。
许多人认为 OO 和功能性不能混为一谈。Java 中最古老和最常用的类之一java.lang.String,既面向对象又是纯函数式接口。没有方法会发生变化,只会返回一个新对象。
添加回答
举报