【问题标题】:Easily set and get data between object structures in Groovy在 Groovy 中轻松设置和获取对象结构之间的数据
【发布时间】:2012-01-11 15:42:12
【问题描述】:

警告。对于 Groovy,这完全是一个新手问题。我来自 Java 背景,我不想那样做,除非我必须这样做。

我想创建一个映射,以便在另一个对象图之间轻松遍历一个对象图。

喜欢:

customer.contact.address.identifier = incomingContact.location.address.idCode

上述两种对象结构完全不同,有时具有不同的数据类型。在上面的 sn-p 中,identifier 是 Long,idCode 是 String。另外,有些对象是空的,所以我想动态创建结构。

如何利用 groovy 的闭包特性和更多函数式编程更好地做到这一点?

我最初考虑的是继承或反射解决方案,以最大限度地减少 if/else 条件和基于实例的编程。

任何想法。

这是我开始的一些伪代码,已经带有 java 的味道:

方法调用:

customer.contact.address.identifier = convert(incomingContact.location.address.idCode)

方法如下:

Long convert(Object fromObject) {

    //example usage that were prototyping for this method (generically)    
    //fromObject = Long.valueOf(5);
    println "convert has: [" + fromObject + "]"
    if(fromObject != null) {

      return fromObject;
    }

    return null;
 }

上面的sn-p本身就有复杂性和问题。一方面,当我想将调用结构设置回一个空对象,但它是一个“长”对象时,它会出错。

直接错误是:

groovy.lang.MissingMethodException:没有方法签名:customer.contact.address.setIdentifier() 适用于参数类型:(null) 值:[null]

我的替代想法是使用映射工具,例如:http://dozer.sourceforge.net/ 并允许它处理两个图的遍历,但它又是 java,我想要那种 groovy 动态类型的解决方案。

【问题讨论】:

  • 您是否有某种伪代码或某些东西可以更清楚地解释您想要的内容?
  • 已更新,希望它有助于理解我的 java 到 groovy 的困惑。我可以很容易地找到 java 反射方式,比如 apache commons,但我正在学习 groovy。谢谢..
  • 你上面的代码没有多大意义,它总是会返回一个非空的fromObject,即使它的类型不是Long(方法的声明返回类型)

标签: grails groovy


【解决方案1】:

如果您只是想将一个对象的属性绑定到另一个对象,Groovy 的功能对您帮助不大。 Dozer 之类的东西可能值得一看。

顺便说一句,这是编写上述代码的 Groovier 方式:

Long convert(fromObject) {

  println "convert has: [" + fromObject + "]"
  fromObject as Long
}

【讨论】:

  • 谢谢,我目前正在尝试将其作为替代方案。我希望找到一些基于 groovy 的方法,通过反射和闭包轻松访问 groovy 中深度嵌套的对象结构。仅使用带有 Java 的 Doozer 并返回对象可能会更容易。很高兴拥有带有 groovy 和 java 的横切代码。
  • 使用 Dozer 的代码没有理由必须是 Java,您可以从 Groovy 代码中调用任何 Java 库
  • FYI - 我们最终使用 Groovy 和 Dozer (java) 集成来合并 XMLBeans 从一个对象到下一个对象。现在使用推土机要干净得多。谢谢。
猜你喜欢
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-28
  • 2010-11-25
相关资源
最近更新 更多