2011-12-23 7 views
0

私は、実行時例外をキャッチすることは、非常に悪い設計の99%であることを知っています。コントロールNullPointerException with XML

しかし、JavaでマッピングされたXMLがあり、最後のノードが存在するかどうかをテストするとします。例:

XML:それは、私たちは20個のノードを持っていた場合を想像...ただ、有効なNULL値を許可するかどうかに多くの行を取る<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()); 

    } 

...

XMLゲッターは、単純な(非常に軽量であることを考えます値が返される)ので、それは我々が代わりに行うことができないパフォーマンス上の理由のために実際にある、nullになる可能性のある民間代表団を持っていない:あなたの意見は何

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

あなたはnullオブジェクトパターンのバリエーションを使用するためにマップされたクラス内の子オブジェクトを初期化できます。その後、getA().getB().getC().getD()のような連鎖呼び出しは常に成功します

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

をしかしDコンテンツはnullになります。

あなたのユースケースにこれを最適化/適応し、おそらくダミー初期化のための専用インスタンスを使用することができます。

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

これは、nullオブジェクトパターンのよりバイ・ブックの使用になります(標準ものの、実装には単なる専用インスタンスではなく専用クラスが必要です)。