这个问题在某种程度上似乎过于“宽泛”和理论化
如果我理解正确,您是在问是否可以在 Java 中创建 DSL...
如果是这样,答案是肯定的。
它是否具有与 Groovy 相同的表现力?没有...
从语言语法的角度来看,Java 是一种相当过时的语言,这基本上是为什么 Scala Groovy 和最近 Kotlin 等“更新”语言出现在 JVM 之上的第一个原因。
拥有用于编写简洁和富有表现力的 DSL 的语法结构是 Java 以非常有限的方式提供的东西,而更现代的语言则拥有更多的结构。
这可能是 DSL 的维护者通常选择 Groovy / Kotlin 作为 DSL 语言而不是 Java 的原因。
例子:
- Gradle - 它基本上是一个基于 groovy 的 DSL,用于构建项目(最近它也获得了 kotlin 支持)
- Jenkins 管道 - 用于在项目上运行 CI 的 Groovy DSL
话虽如此,但仅使用 API 就完全不可能使用 Java 构建 DSL,这不是真的。
以下是示例:
Mockito 有一个用于指定测试期望的 DSL。示例:
when(foo.bar(a,b,c)).thenReturn(d);
另一个尝试创建 DSL 的(相当成功的 IMO)示例是 JOOQ
这个库为使用关系数据库提供了一个非常好的 DSL。
这是一个使用 Jooq 构建的 DSL 的示例(Java,而不是 Groovy):
jooqContext
.select()
.from(MY_TABLE)
.fetch()
因此,您可以借鉴这些语言中 DSL 的外观的想法,并自行决定。