代码之家  ›  专栏  ›  技术社区  ›  user1578872

用于动态逻辑的Java DSL

  •  -2
  • user1578872  · 技术社区  · 6 年前

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

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

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

    1 回复  |  直到 6 年前
        1
  •  4
  •   Mark Bramnik    6 年前

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

    如果我理解正确,您会问是否可以在Java中创建DSL。。。

    如果是,答案是肯定的。 它是否具有与Groovy中相同的表达能力?不

    从语言语法的角度来看,Java是一种非常过时的语言,这基本上是Scala Groovy和最近Kotlin等“较新”语言出现在JVM之上的第一个原因。

    Java以一种非常有限的方式提供了用于编写简洁而富有表现力的DSL的语法结构,而更现代的语言则有更多的结构。

    这可能就是DSL维护人员通常选择Groovy/Kotlin作为DSL语言而不是Java的原因。 示例:

    • Gradle-基本上是一个用于构建项目的基于groovy的DSL(最近它也得到了kotlin的支持)
    • Jenkins pipelines-用于在项目上运行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在这些语言中的外观,自己比较并决定。