2011-12-23 46 views
0

我知道捕捉運行時異常是99%的情況下非常糟糕的設計。控制NullPointerException與XML

但是假設我們有一個映射到Java的XML,並且我們測試了最後一個節點的存在。例如:

XML:<A> <B> <C> <D>someValue</D> </C> </B> </A>

if(myObject.getA() != null && myObject.getA().getB() != null && 
     myObject.myObject.getA().getB().getC() && 
     myObject.myObject.getA().getB().getC().getD() != null){ 

      doSomeAction(myObject.myObject.getA().getB().getC().getD()); 

    } 

它需要許多線只是有效的一個非空......想象一下,如果我們有20個節點...

由於XML干將很輕(簡單返回值),因此沒有任何私人代表,可能是空,是不是真的出於性能原因,我們不能這樣做,而不是:

try{ 
doSomeAction(myObject.myObject.getA().getB().getC().getD()); 
} 
catch(NullPointerException e){ 
throw new NullPointerException("D node doesn't exist , please check your XML", e); 
} 

你有什麼意見是嗎?

回答

2

XPath或其他形式的EL表達式語言。 您可以使用鏈式調用在Builder模式之後創建您自己的表達式類。

3

你可以初始化映射類中的子對象才能使用空對象模式的變化:

class A { 
    private B b = new B(); 
} 

然後,像getA().getB().getC().getD()鏈式調用將永遠成功,但D內容將是null

你能適應/優化給你的用例,並有可能使用專用實例虛擬初始化:

class A { 
    private B b = B.NULL_INSTANCE; 
} 

這將是空對象模式的更多由這本書使用(儘管標準實現涉及一個專門的類而不僅僅是一個專門的實例)。