导航期间动态创建嵌入式实例

时间:2014-09-18 15:57:14

标签: groovy

我正在挖掘groovy使用点符号优雅地导航对象层次结构的能力。

我有一个问题,是否有一种在导航过程中优雅地创建嵌入对象的方法。例如,给定以下类:

  class Bar {
      int a
  }
  class Foo {
      Bar b
  }

我希望能够做到这一点:

  Foo f = new Foo()
  f.b.a = 4

目前,我必须这样做:

  Foo f = new Foo()
  f.b = new Bar()
  f.b.a = 4

请注意,除非通过导航或其他方式设置,否则我需要f.b为null。所以盲目地在Foo类中实例化b = new Bar()不符合要求的需要。

2 个答案:

答案 0 :(得分:1)

您可以使用null安全操作符?.或覆盖bFoo的getter,如果它为null,则在b中设置Foo的新实例,把它归还。

这将是:

class Foo {
   Bar b

   Bar getB() {
    if(b == null) 
       this.@b = new Bar()
    b
   }
}

答案 1 :(得分:0)

您可以在一行中初始化整个层次结构,如下所示:

Foo f = new Foo(b: new Bar(a: 4))