【问题标题】:What does it mean for an expression to contain "at most one side effect, as its outermost operation"?表达式包含“最多一个副作用,作为其最外层的操作”是什么意思?
【发布时间】:2012-09-27 10:25:47
【问题描述】:

Java Language Spex 15.7:

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

什么意思?

【问题讨论】:

    标签: java jls


    【解决方案1】:

    这意味着每个表达式一次应该执行一项任务。

    考虑以下两个声明:

    int a = 10;
    int b = 20;
    

    现在的任务是将这两个ints 相加,并将b 加1。有两种方法。

    int c = a + b++;
    

    int c = a + b;
    b++;
    

    JLS 更喜欢并推荐后者。

    【讨论】:

      【解决方案2】:

      这意味着:

      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());
      

      【讨论】:

      • 关于int x = someFunction(a, b);:你的意思是,像int rows = stmt.executeUpdate()? :-)
      • 是的。这可能是函数可能产生的最大副作用!
      • @BrianAgnew Lukas 的例子真的让我很困扰。这意味着 java 创建者忽略了他们自己的建议。
      【解决方案3】:

      表达式的副作用主要是在表达式求值期间对变量的赋值。

      注意代码:

      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

      看起来很扭曲,不是吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-22
        • 2015-07-24
        • 2016-03-01
        • 1970-01-01
        • 2021-12-30
        • 1970-01-01
        • 1970-01-01
        • 2018-07-31
        相关资源
        最近更新 更多