0

Groovy/Grails 有一个非常简洁的特性*,称为动态查找器,它是 GORM 的一部分,使用“幻像方法”实现,它使用动态消息拦截器将消息传递给对象,如果名称不是当前的实际方法,但匹配特定格式:(字段+比较器)它将合成该逻辑的过滤谓词方法。Groovy 在“MethodMissing”方法中对此提供了特殊支持,Grails/GORM 使用该钩子添加了这个合成的查找器逻辑。

例如,可以执行以下操作:

   students.gpaLessThan(3.0).nameLike("Smith").stateEquals("Iowa");

并从集合中获取过滤结果,这些方法都不是用户编写的。

似乎可以在 Java 中做类似(并行)的事情,使用消息拦截器和合成的动态代理。我打算玩这个,但想知道是否其他人已经做过这样的事情。此外,我想知道使用注解是否可以对此类合成名称实现一些静态类型检查,因为注解至少可以生成带有方法引用的代码,然后编译器将对其进行检查。

[*我不是 Groovy 用户,只是阅读了该功能的一些示例,因此我可能对 Groovy 的实现细节不正确。]

4

2 回答 2

1

这将违背静态类型的哲学。

您可以考虑使用 Java 8,您可以在其中进行过滤

Stream<Student> students = ...
students.filter( s->s.gpa<3.0 )
        .filter( s->like(s.name, "Smith") )
        .filter( s->s.state.equals("Iowa") );
于 2013-11-13T01:38:02.053 回答
1

看看Spring Roo。它是一个基于 Java 的框架,从 Grails 中汲取了很多灵感。Roo 有一个有趣的使用方面的动态查找器实现。

于 2013-11-13T09:17:15.477 回答