28

我继承了大量的 Groovy 代码,我发现由于以下几个原因难以维护:

  1. 很多时候很难分辨变量的类型。
  2. 推论:很容易修改具有不同类型的变量,并且不知道它。
  3. 直到运行时才会发现许多错误(如果您的单元测试没有涵盖几乎所有内容,这很可怕)。
  4. 参数的类型基本上被忽略了。
  5. 我正在使用的 IDE (STS Pro) 很有用,但远远落后于 Java。例如,重构是不可用的。
  6. 建议有时可用,有时则不可用。

尽管我很欣赏该语言的紧凑性,但维护起来却很困难且繁琐。

我试图手动将一些部分转换为 Java,这很痛苦。您是否知道任何有助于此转换的工具或插件?

4

8 回答 8

31

IntelliJ IDEA对 groovy 代码的重构提供了相当不错的支持。它还有一个来自 Groovy -> Java 的源代码级转换器。大多数情况下,它会生成无法编译的代码,但它可能有助于您开始转换代码的过程。Groovy 代码:

class HelloWorld {
def name
def greet() { "Hello ${name}" }
int add(int a, int b) {
    return a+b;
}
}

转换后的 Java 代码:

public class HelloWorld {
public GString greet() {
    return "Hello " + String.valueOf(name);
}

public int add(int a, int b) {
    return a + b;
}

public Object getName() {
    return name;
}

public void setName(Object name) {
    this.name = name;
}

private Object name;
}
于 2014-03-04T22:07:40.550 回答
16

可能不是您想听到的答案,但我会专注于让 Groovy 变得更加舒适,而不是尝试将代码转换为 Java。您可以在 Groovy 中执行许多无法很好地转换为 Java 的事情(例如闭包)。任何到 Java 的自动转换都会使代码的可读性和理解性大大降低。

如果无法说服您坚持使用 Groovy,并且必须迁移到 Java,那么最好的办法就是手工完成。

于 2011-03-14T17:36:09.550 回答
6

Groovy 和 Java 语言都编译为相同的字节码(Java 平台字节码)。所以只需(a)将您的 .groovy 文件编译为 .class 文件;(b) 使用 JDGUI 等反编译器将您的 .class 文件反编译为 .java 文件。

于 2015-11-01T22:07:53.907 回答
3

我的首要建议是编写大量单元测试

该建议适用于大多数动态语言,因为您从编译器的静态类型检查中获得的“安全网”较少。您需要添加测试以检查输入和输出值是否具有正确的类型等。

我认为这将解决您的大部分问题。

于 2011-03-14T18:07:03.013 回答
3

我使用 Groovy++ 找到了替代解决方案。它几乎具有 Groovy 的所有优点,但具有来自 Java 的性能和强类型。此外,它是基于 Groovy 的,所以显然您只需要添加一个 jar 文件,并在代码顶部添加“@Typed”注释。

此外,它添加了一个新功能,例如“GrUnit”,并允许混合动态和静态类型,我希望这将允许创建 DSL。因此它允许与现有的 Groovy 代码混合,并与 Grails 一起使用。

该项目似乎很年轻,但确实很有希望。我已经在试水,并检查我能走多远。

所以,这个答案实际上并没有说明如何将 Groovy 转换为 Java,但您可以获得更好的东西:两个世界加上可选的第三世界的好处——没有双关语:-)——静态类型和性能。

于 2011-05-09T19:26:41.053 回答
0

一年前有个问题。经过一两个月的狂喜之后,它在现实世界中变得虚弱。甚至 GReclipse 2.0 也没有减轻痛苦,代码变得难以管理和痛苦。简短回答您的问题 - 不。没有真正好的工具可以做到这一点。GSql 我用 Spring JdbcTemplate 替换,用回调闭包。所有这些都需要手动决定替换策略,所以如果你想获得一个好的代码,你需要手动 int。否则你可能会使用一些 java 反编译器,但我认为这不是你真正想要的。

于 2011-03-14T17:37:28.693 回答
0

我们会将大约 1000 个 Groovy 类更改为 Java 8。

  • 自动:我认为它可能与手动步骤相结合

迁移的可能步骤

  • def 变量:在 IDE 中手动替换为正确的类名

  • def 方法:在 IDE 中手动替换为正确的类名作为返回值

  • 文件重命名:自动将所有 .groovy 文件替换为 .java 文件(Java 8)

  • clousures : 用 Ja​​va 8 Lambdas 和 Java 8 Streams 手动替换

  • Groovy overritten Methodes:手动替换为较新的 Java jdk Klasses,即新文件 io、新日期 API 或包含 Apache 库

使用单元测试来控制重构。

PS:我们使用。带有 Groovy 插件的 Eclipse。

问候罗比

于 2015-06-06T08:09:38.893 回答
0

对于有类似问题的人,您可以查看 GMavenPlus

于 2017-07-16T12:30:11.437 回答