2013-11-24 122 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

相關問題