2013-11-24 76 views
0

我试图在Java应用程序中嵌入POGO。我想用POGO用一些虚拟数据实例化POJO进行测试。我认为这将是可能的POGO延长POJO,并像在这个例子中命名的参数调用POJO的构造函数:使用命名参数调用父构造函数

的Java类:

public class Pojo { 
    private String name; 
    ... 
} 

Groovy类:

class Pogo extends Pojo { 
    Pogo() { 
    super(name: 'test name') 
    } 
} 

试图通过从JUnit测试实例化的Pogo

@Test 
public void shouldInitPojoWithTestData() { 
    Pojo p = new Pogo(); 

    assertNotNull(p); 
    assertEquals("test name", p.getName()); 
} 

失败

groovy.lang.GroovyRuntimeException: Could not find matching constructor for: Pojo(java.util.LinkedHashMap) 

然而,实例名为参数POJO Groovy脚本中正常工作:

def p = new Pojo(name: 'test name') 
assert p.name == 'test name' // OK 

为什么我不能调用与命名参数的父类的构造?

Thx

回答

2

命名构造函数参数是一种语法糖。它将被翻译成一个链,从默认的无参数构造函数开始,然后进行mutator调用。

例如,当你叫

def p = new Pojo(name: 'test name') 

将被翻译成:

def p = new Pojo() 
p.setName('test_name') 

super调用父类的构造函数直接调用。命名参数合并到一个Map实例,然后,我们尝试使用单个映射参数调用super

而编译器告诉你,没有这样的构造函数。

您可以声明它并手动从给定的地图中提取字段值,但在Java中它将不受欢迎(手动,如this.name = map.get(“name”))或复杂(通过反射)。

您可以在POGO中使用工厂方法创建pojo。像这样

class POGO { 
    static Pojo createPOJO() { 
     new Pojo(name: 'test_name') 
    } 
} 
+0

感谢您的回答! – MartinKnopf

相关问题