Есть ли способ автоматически конвертировать Groovy в Java? - PullRequest
21 голосов
/ 14 марта 2011

Я унаследовал значительное количество кода на Groovy, и мне было трудно поддерживать его по нескольким причинам:

  1. Очень часто трудно определить тип переменной.
  2. Следствие: легко изменить переменную с другим типом, не зная об этом.
  3. Многие ошибки будут обнаружены до времени выполнения (что пугает, если ваше модульное тестирование неохватывает почти все).
  4. Тип параметров в основном игнорируется.
  5. Используемая мной среда разработки (STS Pro) полезна, но далеко отстает от Java.Например, рефакторинг просто недоступен.
  6. Предложения доступны иногда, другие - нет.

Хотя я ценю компактность языка, обслуживание было трудным и громоздким.

Я пытался вручную преобразовать некоторые части в Java, это было больно.Вам известны какие-либо инструменты или плагины, которые помогают с этим преобразованием?

Ответы [ 8 ]

24 голосов
/ 05 марта 2014

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;
}
15 голосов
/ 14 марта 2011

Вероятно, это не тот ответ, который вы хотели бы услышать, но я бы сосредоточился на том, чтобы освоиться с Groovy, а не пытаться преобразовать код в Java. В Groovy вы можете сделать много вещей, которые просто не будут хорошо переводиться на Java (например, замыкания ). Любое автоматическое преобразование в Java сделает код намного менее читаемым и трудным для понимания.

Если вас не убеждают придерживаться Groovy, и вы ДОЛЖНЫ перейти на Java, лучше всего сделать это вручную.

4 голосов
/ 02 ноября 2015

Языки Groovy и Java компилируются в один и тот же байт-код (байт-код платформы Java).Так что просто (а) скомпилируйте ваш файл .groovy в файл .class;(b) использовать декомпилятор, такой как JDGUI, для декомпиляции вашего файла .class в файл .java.

3 голосов
/ 09 мая 2011

Я нашел и альтернативное решение, используя Groovy ++. Он обладает практически всеми преимуществами Groovy, но с производительностью и строгой типизацией из Java. Кроме того, он основан на Groovy, так что, очевидно, вам нужно добавить только один файл jar и аннотацию "@Typed" вверху кода.

Кроме того, он добавляет новые функции, такие как «GrUnit», и позволяет смешивать динамические и статические типы, что, я надеюсь, позволит создавать DSL. Это позволяет смешивать с существующим Groovy-кодом и использовать с Grails.

Проект выглядит молодым, но по-настоящему перспективным. Я уже проверяю воды и проверяю, как далеко я могу пройти.

Итак, этот ответ на самом деле не говорит о том, как конвертировать Groovy в Java, но вы можете получить что-то еще лучше: преимущества обоих миров плюс и необязательный третий мир - не каламбур :-) - статическая типизация и производительность .

3 голосов
/ 14 марта 2011

Мой главный совет - , пишите множество юнит-тестов .

Этот совет верен для большинства динамических языков, потому что вы получаете меньше «защитной сети» от статической проверки типов компилятором. Вы захотите добавить тесты, чтобы проверить, что входные и выходные значения имеют правильный тип и т. Д.

Я думаю, что это решит большинство ваших проблем.

0 голосов
/ 16 июля 2017

для тех, у кого похожий вопрос, вы можете посмотреть на GMavenPlus

0 голосов
/ 06 июня 2015

Мы изменили бы около 1000 Groovy-классов на Java 8.

  • автоматически: я думаю, что это возможно в сочетании с ручными шагами

Возможные шаги для миграции

  • def Переменные: заменить вручную на правильное имя класса в IDE

  • def Методы: заменить вручную на правильное имя класса в качестве возвращаемого значения вIDE

  • Переименование файла: Автоматически заменять все файлы .groovy на файлы .java (Java 8)

  • clousures: заменить вручную на Java 8 Lambdasи потоки Java 8

  • Перезаписанные Groovy методы: заменить вручную на новые классы Java jdk, т.е. New File io, API New Date или включить библиотеки Apache

Используйте свои юнит-тесты для контроля вашего рефакторинга.

PS: Мы usw.Затмение с плагином Groovy.

Привет, Роби

0 голосов
/ 14 марта 2011

есть вопрос год назад.После одного или двух месяцев пышной эйфории она изменилась на слабый реальный мир.Даже GReclipse 2.0 не делает меньше боли, код становится неуправляемым и болезненным.Краткий ответ на ваш вопрос - нет.Не очень хороший инструмент для этого.GSql я заменяю Spring JdbcTemplate, замыкания с обратными вызовами.Все это требует ручного решения о стратегии замены, поэтому, если вы хотите получить хороший код, вам нужно выполнить int manauly.Еще вы можете использовать некоторые декомпиляторы Java, но я думаю, что это не то, что вы действительно хотите.

...