【问题标题】:Order of execution of parameters guarantees in Java?Java中参数保证的执行顺序?
【发布时间】:2011-01-13 04:30:17
【问题描述】:

鉴于C 中的以下函数调用:

fooFunc( barFunc(), bazFunc() );

没有指定barFuncBazFunc的执行顺序,所以C中的barFunc()可以在bazFunc()或者bazFunc()之前在barFunc()之前调用。

Java 是否指定了函数参数表达式的执行顺序,或者像 C 这样的未指定?

【问题讨论】:

标签: java operator-precedence specifications jls


【解决方案1】:

来自Java Language Specification(关于表达式):

15.7.4 参数列表从左到右求值

在方法或构造函数调用中 或类实例创建表达式, 参数表达式可能出现在 括号,用逗号分隔。 每个参数表达式似乎是 在任何的任何部分之前充分评估 参数表达式在它的右边。

【讨论】:

  • 虽然这是真的,但请不要以使其依赖于执行顺序的方式进行编码。它只是增加了复杂性而不增加功能。
  • 确实,“建议代码不要过度依赖本规范。” java.sun.com/docs/books/jls/third_edition/html/…
  • @Jon 我不同意!如果它在规范中,那么您可以依赖它。例如,要从文件中读取矩形,我使用以下代码: myRect = new Rectangle(scan.nextInt(), scan.nextInt(), scan.nextInt(), scan.nextInt());它简洁明了。更长的实现将是不必要的复杂性。
  • 我用它来避免在许多地方保存局部变量,并使解析器中每个函数调用的代码缩短 1/2 行:D。避免许多局部变量(除非创建更复杂的代码)通常也是好的设计。
  • @Jon 如果 Java 允许在构造函数链接调用之前声明临时变量,我会同意你的看法。但是,在将构造函数链接与复杂的成员初始化结合使用时,我认为没有可行的替代方法来依赖这种行为。
猜你喜欢
  • 2012-12-28
  • 2016-04-29
  • 1970-01-01
  • 2021-03-07
  • 2018-01-07
  • 1970-01-01
  • 2016-05-02
  • 2014-07-22
  • 1970-01-01
相关资源
最近更新 更多