【问题标题】:Are annotations some sort of DSL in Java?注释是Java中的某种DSL吗?
【发布时间】:2011-03-15 10:22:58
【问题描述】:

在一堆 XML 配置文件之后,我看到 Java 转向基于注释的配置。

注解在这里扮演了DSL的角色吗?

是因为 Java 的静态特性吗?我在考虑没有(afaik)这样的东西的Ruby。是因为 Ruby 有很好的元编程能力吗?

是否有替代方案(我的意思是除了使用一堆 .xml 文件)

【问题讨论】:

    标签: java ruby annotations metaprogramming dsl


    【解决方案1】:

    基本上注解是一个工具,它允许您在编译时处理源文件并执行与文件中找到的注解相对应的操作(可能派生新的源)。

    它们对于许多用途都非常有用,例如显式约束,同时避免使代码混乱或丰富某些方法的行为。

    我不会说它们与 Ruby 的 DSL 如此相似,因为在这种情况下,您可以使用特定的语法注释代码,而在 Ruby 中,您可以从头开始设计自己的 DSL,并按照您的意愿使用。

    Java 提供了一个名为 apt 的工具(就像您怀疑的那样),它也能够在运行时处理注释,但它们通常用于向您的用户提供编译时信息来源。这并不意味着在某些情况下,您无法轻松地调整注释机制来解决您使用 DSL 获得的相同内容,但它们的存在目的不同。

    【讨论】:

    • 我认为说注解通常用于编译时处理是不准确的。我认为最近注释的主要用途是作为元数据,允许在运行时完成有趣和有用的事情。
    • 我说的是他们出生的原因。现在这个概念已经被广泛扩展,以克服 Java 语言的不足 :) 但我不会说它们涵盖了 DSL 的目的......你会吗?
    • 有什么替代方案(在一般的编译编程语言中)?
    • 我想说,对于 Java,最好的选择是使用像 Groovy 这样的扩展,它允许像在 ruby​​ 中一样轻松地使用 DSL 进行元编程。
    【解决方案2】:

    如前所述,注释可用于非常有效地创建 DSL,因为它们为语言添加了某种元编程功能。然而,为了这个目的,您可以使用字节码注入器甚至任何其他 Java 语言功能。 然而,注释的主要目的是能够用元数据注释源代码元素。 如果您正在寻找在 Java 中创建内部 DSL 的替代方法,只需查看 Fowler's DSL book WIP 并从可用于实现内部 DSL 的不同概念中进行选择,其中许多概念都存在于 Java 中。如果您正在寻找元编程的替代方案,那么还有很多:不同的字节码注入器、使用 AspectJ 或 Spring 的面向方面的编程或代码生成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-05
      • 2011-05-13
      • 2017-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多