【问题标题】:Dynamic finders in Java?Java中的动态查找器?
【发布时间】:2013-11-13 01:21:09
【问题描述】:

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

例如,可以这样做:

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

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

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

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

【问题讨论】:

    标签: java grails groovy grails-orm


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      Stream<Student> students = ...
      students.filter( s->s.gpa<3.0 )
              .filter( s->like(s.name, "Smith") )
              .filter( s->s.state.equals("Iowa") );
      

      【讨论】:

      • 是的,我同意,并且更喜欢 J8 - 这只是一个实验! (你举的好例子!)
      • 不,关键是 grails/rails 会根据动态查找器生成查询,但 java8(其用法类似于 slick)确实会从 db 返回所有结果,然后在 java 中进行过滤,即效率不高。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      • 2015-09-18
      • 1970-01-01
      • 1970-01-01
      • 2015-08-20
      • 1970-01-01
      相关资源
      最近更新 更多