Вопрос кажется слишком "широким" и в некоторой степени теоретическим
Если я правильно понимаю, вы спрашиваете, возможно ли создать 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 могут выглядеть на этих языках, сравнить и решить для себя.