2011-06-22 46 views
0

我與JENA framework工作刮有關公共合同信息,併發布爲RDF,我不能克服以下問題:
當創建新的RDF模型,我爲每個新建Resource合同,然後分配一堆屬性(我刮)使用JENA的addProperty(Property, RDFNode)addProperty(Property, String)方法。問題是,有些合同缺少一些屬性,所以我得到NullPointerException
使用如何避免過多的空比較

if(contract.getProperty() != null) 
{ 
    resource.addProperty(VOCABULARY.property, contract.getProperty()); 
} 

爲每一個屬性可能不是最好的方式,因爲addProperty()方法的第二個參數相差很多 (它可以直接在contract.getProperty(),但有時也model.createLiteral(contract.getProperty())model.createTypedLiteral(contract.getProperty(), XSDDataType.XSDInt)等),我無法創建我自己的myAddProperty()方法 ,我將檢查null並致電JENA的addProperty()
作爲跳過所有空屬性的最佳解決方案,您會有什麼建議?
非常感謝您的任何建議。

+1

什麼類型的類是資源變量?你能繼承那個類並重寫'addProperty()'方法嗎? – Marcelo

+3

爲什麼不能「myAddProperty()」然後調用「addProperty()」方法? – JustinKSU

+0

@Marcelo資源變量是com.hp.hpl.jena.rdf.model.Resource類型,不錯的主意,我會嘗試創建並覆蓋addProperty() – tom

回答

1

重構空校驗到一個單獨的方法:

private void addProperty(final Resource resource, final String key, final String value) { 
    if (value != null) { 
     resource.addProperty(key, value); 
    } 
} 

然後,您可以使用此方法如下:

addProperty(resource, VOCABULARY.property, contract.getProperty()); 
+0

就是這樣:)謝謝 – tom

+0

一個問題,爲什麼要用'final'參數? – tom

+0

@tom - 這顯然是一個相當有爭議的做法!看到這裏的辯論:http://stackoverflow.com/questions/500508/why-should-i-use-the-keyword-final-on-a-method-parameter-in-java就我個人而言,我認爲它增加了可讀性(和意圖)我的代碼。 – hoipolloi

0

我對這些框架並不十分熟悉,但也許你可以繼承Resource並做類似的事情? :

@overrides 
public void addProperty(String key, String value) 
{ 
    if (value != null) super.addProperty(key,value); 
} 
+0

,com.hp.hpl.jena.rdf.model.Resource實際上是一個接口 – tom

+0

哦,對不起。該接口的實現至少可以攔截(例如,像一個方面)? –

+0

接口有很多方法,所以它很長,我想我可以實際創建'myAddProperty()'(如上所述),但是謝謝你的想法,它真的幫了我很多 – tom