【问题标题】:Java DSL for dynamic logic用于动态逻辑的 Java DSL
【发布时间】:2018-11-11 06:14:39
【问题描述】:

我们有 Groovy DSL,使用它我们可以将要执行的逻辑存储在 DB 中,并在 Java 中执行相同的 groovy 脚本。

Java 也可以吗?我正在使用 Java 11。

要求是读取 JSON 输入并更新给定字段的值。字段和逻辑应该是动态的。

【问题讨论】:

  • 您的意思是不使用库吗?还是3rd party library 有效?注意 - 这与 SO 无关。
  • 我更喜欢没有图书馆。要求是有N个逻辑要执行。

标签: java dsl java-11


【解决方案1】:

这个问题在某种程度上似乎过于“宽泛”和理论化

如果我理解正确,您是在问是否可以在 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 的外观的想法,并自行决定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多