【问题标题】:Is Groovy syntax an exact superset of Java syntax?Groovy 语法是 Java 语法的精确超集吗?
【发布时间】:2010-11-24 22:20:41
【问题描述】:

作为一名 Java 程序员,我并没有 Groovy 背景,但我最近经常使用 Groovy 来扩展 Maven(使用 GMaven)。到目前为止,我可以在 Groovy 中使用我需要的所有 Java 代码以及添加的 Groovy 糖(元类方法、更多运算符、闭包)。我对 Groovy 的了解还远未完成,但我喜欢它,尤其是出于脚本目的(我对在企业场景中使用非静态类型语言有点谨慎,但这不是这里的主题)。

不管怎样,问题是:

所有有效的 Java 代码都会自动成为 Groovy 代码吗?(我说的是源代码,而不是编译的类,我知道 Groovy 可以与 Java 类交互。)或者是否有 Java 构造在 Groovy 中是非法的吗?也许是保留的 Groovy 关键字,可以用作 Java 中的标识符,或者其他什么?还是有意将 Groovy 设计为与 Java 100% 源代码兼容?

【问题讨论】:

标签: java syntax groovy


【解决方案1】:

不。以下是 groovy 中的关键字,但不是 Java:

any    as     def    in     with

此外,虽然不是关键字,delegateowner 在闭包中具有特殊含义,如果您不小心可能会绊倒您。

此外,语言语法也有一些细微差别。一方面,Java 对数组大括号在声明中的位置更加灵活:

public static void main(String args[]) // valid java, error in groovy

Groovy 的解析方式也不同。这是一个例子:

public class Test {
    public static void main(String[] args) {
        int i = 0;
        i = 5
        +1;
        System.out.println(i);
    }
}

Java 会打印 6,groovy 会打印 5。

虽然 groovy 主要与 java 源代码兼容,但也有很多不一样的极端情况。也就是说,它与人们实际编写的代码非常兼容。

【讨论】:

  • 啊,行结束语句(许多可怕错误的来源,例如在 JavaScript 中)。感谢您的提示 (+1)
  • Java 中的 String args[] 表示法很糟糕(让我想起了我讨厌 C 的所有事情)。很高兴听到 Groovy 没有这个功能。
  • Java 中的 String[] args 符号很糟糕(让我想起了我讨厌 Java 的所有事情)。太糟糕了,看到 Groovy 不支持另一种方式...... :(
【解决方案2】:

不是。

我最喜欢的不兼容:文字数组:

String[] s = new String[] {"a", "b", "c"};

在 Groovy 中,这种上下文中的花括号应该包含闭包,而不是文字数组。

【讨论】:

  • 而 groovy 版本是 String[] s = ["a", "b", "c"]; ?
  • 有没有办法在 Groovy 中做到这一点?我的意思是:有一个实际的数组,而不是列表。
  • ^^ 差不多。 [] 语法创建一个列表。但是,如果您在行尾添加“as String[]”
  • @Goran 在声明类型时,在该示例中不需要as...String[] arr = [ 'a', 'b', 'c' ] 就足够了
  • 在这种情况下接受答案并不容易,他们都很好,没有一个正确的答案。所以我给 Goran 打勾是因为他的代表最低。
【解决方案3】:

a page on the Groovy site 记录了一些差异,another page which lists gotchas(例如换行符)

还有其他一些事情,例如 Groovy 不支持 do...while 循环结构

【讨论】:

  • 谢谢。 一个例子是 Groovy 不支持 do...while 循环结构 也是一件好事。我开始觉得 Groovy 从 Java 中汲取了所有好东西,而忽略了所有糟糕的东西。这就引出了一个明显的问题:Groovy 有循环标签吗?
  • 是的,循环标签在那里,所以continue labelbreak label 是有效的Groovy
【解决方案4】:

其他人已经给出了在 Groovy 中非法的 Java 语法示例(例如文字数组)。还值得记住的是,一些在两种语言中都是合法的语法在两种语言中并不意味着同样的事情。例如在 Java 中:

foo == bar

身份测试,即foobar 是否都引用同一个对象?在 Groovy 中,这会测试对象是否相等,即它返回 foo.equals(bar) 的结果

【讨论】:

  • 我知道,这是 groovy 恕我直言的一个可怕功能。幸运的是,我几乎从不依赖 Java 中的 ==(对于非基元),所以我也不会在 Groovy 中犯这个错误。
  • 我不同意。我认为它是一个很好的功能。相等性测试是更常见的情况,并且不依赖于不那么直观的身份概念。另外,对象编写者可以通过覆盖equals() 方法来完全控制它。身份测试由语言严格定义,并暴露出丑陋的 java 不一致之处,例如 new Long(1) != new Long(1)Long.valueOf(1) == Long.valueOf(1)。 Groovy 使“好的”案例使用运算符(可读、直观),而“坏”的案例使用方法调用(将其标记为异常以进行记录)。 Java 则相反。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-01
  • 2017-03-31
  • 2015-07-30
  • 2020-04-06
  • 1970-01-01
  • 2014-09-25
  • 1970-01-01
相关资源
最近更新 更多