表达式包含“最多一个副作用,作为其最外层的操作”是什么意思?

时间:2012-09-27 10:25:48

标签: java jls

Java Language Spex 15.7中:

  

当每个表达式最多包含一侧时,代码通常更清晰   效果,作为其最外层的操作

这是什么意思?

3 个答案:

答案 0 :(得分:12)

这意味着每个表达式应该一次完成一个任务。

考虑以下两个声明:

int a = 10;
int b = 20;

现在的任务是添加这两个int并将b增加1.有两种方法可以做到。

int c = a + b++;

int c = a + b;
b++;

JLS更喜欢并推荐后者。

答案 1 :(得分:5)

这意味着:

int x = someFunction(a, b);
someFunction(a, b)没有任何副作用时,

更清晰,即它不会改变任何东西。相反,上面的唯一变化是对x的分配。

另一个例子是使用前缀/后缀增量器。

int x = a + b;

更清晰
int x = (a++) + (++b);

因为只分配了x。在第二个示例中,ab在同一语句中进行了更改。

通过限制副作用,您可以更轻松地推断代码的功能和/或重新排序语句调用,包括将它们并行化,例如:在下面,如果方法没有副作用,那么您可以调用方法a()b()c()以任何顺序和/或并行方式表示参数

int res = f(a(), b(), c());

答案 2 :(得分:2)

表达式的副作用主要是在评估表达式时对变量的赋值。

请注意代码:

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

看起来很扭曲,不是吗?