Java DSL для динамической логики - PullRequest
0 голосов
/ 11 ноября 2018

У нас есть Groovy DSL, с помощью которого мы можем сохранить логику для выполнения в БД и выполнить тот же самый Groovy-скрипт в Java.

Возможно ли и с Java? Я использую Java 11.

Требуется прочитать ввод JSON и обновить значение для данного поля. Поле и логика должны быть динамическими.

1 Ответ

0 голосов
/ 11 ноября 2018

Вопрос кажется слишком "широким" и в некоторой степени теоретическим

Если я правильно понимаю, вы спрашиваете, возможно ли создать DSL в Java ...

Если это так, ответ - да. Будет ли он иметь такой же уровень выразительности, как у Groovy? Нет ...

Java с точки зрения синтаксиса языка является довольно устаревшим языком, и это, по сути, первая причина, по которой "более новые" языки, такие как Scala Groovy и недавно Kotlin, появились на вершине JVM.

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

Возможно, именно поэтому разработчики DSL обычно выбирают Groovy / Kotlin в качестве языка DSL, а не Java. Примеры:

  • Gradle - это, по сути, базовый DSL для сборки проекта (недавно он также получил поддержку kotlin)
  • Трубопроводы Jenkins - Groovy DSL для запуска CI в проектах

Сказав это, это неправда, что совершенно невозможно создавать DSL с Java только с помощью API.

Вот примеры:

У Mockito есть DSL для определения ожиданий тестов. Пример: * 1 023 *

when(foo.bar(a,b,c)).thenReturn(d);

Другим примером (довольно успешной IMO) попытки создания DSL является JOOQ Эта библиотека предоставляет очень хороший DSL для работы с реляционными базами данных.

Вот пример того, как выглядит DSL, созданный с помощью Jooq (Java, а не Groovy):

jooqContext
    .select()
    .from(MY_TABLE)
    .fetch()

Таким образом, вы можете позаимствовать идеи о том, как DSL могут выглядеть на этих языках, сравнить и решить для себя.

...