【发布时间】:2018-05-26 12:31:45
【问题描述】:
我正在尝试在 Java 教科书中研究这个问题。 问题是重写这个程序以消除副作用, 通过调用函数(或方法,这有点像)会产生对对象或程序变量状态的更改。
包装副作用;
public class SideEffect {
**public static int x;**
public static int f(int n){
x = x * 2;
return x + n;
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
x = 5;
//int result = f(x) + f(x);
int result = 2 * f(x);
//System.out.println(result);
}
}
注释掉的行是当我实现整数变量并将其打印输出时发生的情况。 如果我实现这些行并注释掉其他行, 结果是 45。 如果实施另一个, 结果是 30。 有没有办法理顺程序,所以没有副作用? 我在想我删除了全局变量行,因为它在书中说它会导致这种糟糕的情况, 混乱的代码。 但是我还能尝试什么?
【问题讨论】:
-
你想要的输出是什么?
-
问题没有说明具体的输出。它只是建议让函数接受 x 的值作为参数使用,而不是修改全局变量。
-
“消除副作用”,我猜你的意思是外部可见副作用由方法执行产生。还有其他类型的副作用,在 Java 中你不能轻易避免。
-
摆脱全局变量是正确的。如果你不知道它的输出应该是什么,就很难修复一个程序,所以很难说
f函数的实现应该是什么。 -
程序的全部目的是产生副作用。如果你的程序没有副作用,比如 print 语句,你可以用一个完全空的程序替换它。
标签: java lambda functional-programming