【发布时间】:2012-09-27 10:25:47
【问题描述】:
【问题讨论】:
【问题讨论】:
这意味着每个表达式一次应该执行一项任务。
考虑以下两个声明:
int a = 10;
int b = 20;
现在的任务是将这两个ints 相加,并将b 加1。有两种方法。
int c = a + b++;
和
int c = a + b;
b++;
JLS 更喜欢并推荐后者。
【讨论】:
这意味着:
int x = someFunction(a, b);
当someFunction(a, b) 没有任何副作用时更清楚,即它不会改变任何东西。上面的唯一变化是分配给x。
另一个例子是使用前缀/后缀增量器。
int x = a + b;
比
更清晰int x = (a++) + (++b);
因为只分配了x。在第二个示例中,a 和 b 在同一语句中进行了更改。
通过限制副作用,您可以更轻松地推断代码的功能和/或重新排序语句调用,包括并行化它们,例如在下面,如果方法没有副作用,那么您可以调用方法a()、b() 和c(),以任意顺序和/或并行表示参数。
int res = f(a(), b(), c());
【讨论】:
int x = someFunction(a, b);:你的意思是,像int rows = stmt.executeUpdate()? :-)
表达式的副作用主要是在表达式求值期间对变量的赋值。
注意代码:
int x = 5, y = 7;
while ((z = x-- + --y) > 0 ) {
console.out("What is 'z' now? " + z);
console.out("How many times will this be printed?");
}
病情评估有 3 个副作用:
x
y
z
看起来很扭曲,不是吗?
【讨论】: