2

XML を JAXB pojo に読み込んでおり、フィールドをエンティティ pojo にマージしたいと考えています。ただし、XML の値が null の場合 (つまり、値が XML に存在しない場合)、既存の値を上書きしたくありません。だから今、私は次のような長いコードセットを持っています:

        if (addressDetails.getNAME1() != null) {
            org.setName1(addressDetails.getNAME1());
        }
        if (addressDetails.getNAME2() != null) {
            org.setName2(addressDetails.getNAME2());
        }
        if (addressDetails.getNAME3() != null) {
            org.setName3(addressDetails.getNAME3());
        }

これは醜く、うるさく、Sonar はサイクロマティックな複雑さを訴えます。これをどのように行うつもりですか?頭に浮かぶこと:

  • リフレクションを使用する util (遅く、タイプ セーフではない)
  • エンティティ クラスへのラッパー クラス (詳細、ボイラープレート)

私は読みやすく、余分なコードをあまり使わないものを目指しています。

4

3 に答える 3

1

Google の Guava コード ライブラリをご覧ください。null を処理するためのユーティリティ メソッドがいくつかあります。

于 2013-02-07T10:59:57.920 に答える
0

これは、SpringのBeanUtilsクラスに基づく柔軟で遅いソリューションです。

PropertyDescriptor[] descriptors = getPropertyDescriptors(YourSourceClass.class);
List<String> ignoredProperties = new ArrayList<String>();
for(PropertyDescriptor pd : descriptors){
    if(pd.getReadMethod().invoke(yourSourceObject) == null){
        ignoredProperties.add(pg.getBaseName());
    }   
}

BeanUtils.copyProperties(yourSourceObject, yourTargetObject, ignoredProperties.toArray());

設定する可能性のあるすべてのフィールドに対して、明示的なnullチェック、ゲッター、およびセッターを作成する必要がなくなります。

リフレクションを避けたい場合は、この構成を短くすることができます。

if (addressDetails.getNAME3() != null) {
        org.setName3(addressDetails.getNAME3());
}

Guavaのようなユーティリティメソッドを使用するObjects.firstNonNull

 org.setName3(Objects.firstNonNull(addressDetails.getNAME3(), org.getName3()));

これは、プロパティごとに1行を書き込むことを回避するのに役立ちませんが、とにかくコードを大幅に短縮します。

于 2013-02-07T11:19:18.313 に答える
-1

この作業をきちんと行うことができる Reflection (もちろん BeanUils のようなライブラリを介して) を使用することをお勧めします。

于 2013-02-07T10:34:07.047 に答える