注释是Java中的某种DSL吗?

时间:2010-07-13 16:29:23

标签: java ruby annotations metaprogramming dsl

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

注释是否在这里扮演DSL的角色?

是因为Java的静态特性吗?我在Ruby中思考那些没有(afaik)这样的东西。是因为Ruby具有良好的元编程功能吗?

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

2 个答案:

答案 0 :(得分:2)

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

它们非常适用于许多目的,例如明确约束,同时避免使代码混乱或丰富某些方法的行为。

我不会说它们与Ruby的DSL非常相似,因为在这种情况下,您使用特定语法注释代码,而在Ruby中,您可以根据划痕设计自己的DSL并根据需要使用它。

Java提供了一个名为apt的工具(就像您怀疑的那个),它也可以在运行时使用注释,但它们通常用于提供编译时信息你的消息来源。这并不意味着在某些情况下,您不能轻易地调整注释机制来计算您使用DSL获得的相同内容,但它们并不存在于同一目的。

答案 1 :(得分:0)

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