0
 public class TopLevelObject{

    List<SecondLevelObject> secondLevelObjects;
    Long field;

}

public class SecondLevelObject{
    List<ThirdLevelObject> thirdLevelObjects;
    Long field;

}

public class ThirdLevelObject{
     Long field1;
     Long field2;

}

SecondLevelObjects のリストを含む TopLevelObject があり、そのすべてに ThirdLevelObjects のリストが含まれます。

この構造体のいくつかのフィールドを最初に反復して初期化し、他のフィールドの初期化を延期する必要がありますが、最初から反復することは避けてください。

そのフィールドのセッターへの参照/パスを保存して後で呼び出すことは可能ですか? (いつどのセッターを呼び出すかを知っていると仮定します)

4

2 に答える 2

0

必要な場合は、パスに基づいてApache BeanUtils.PropertyUtilsを使用してセッターを呼び出すことをお勧めします。いくつかの使用方法を以下にリストします。

PropertyUtils.setProperty(Object bean, String propertyName, Object value)  
PropertyUtils.setNestedProperty(Object bean, String propertyName, Object value)   
PropertyUtils.setIndexedProperty(Object bean, String propertyName, int index, 
                                 Object value) 
PropertyUtils.setIndexedProperty(Object bean, String propertyName, Object value)
于 2012-10-13T15:06:21.623 に答える
0

まず、これは単なるパフォーマンスの問題ですか?もしそうなら、あなたがそれを測定したときに戻ってくるからです.

第二に、あなたが賢すぎないことを確認してください。インナープラットフォーム効果について読んでください。この遅延初期化コードを手動でロールする必要が本当に必要ですか、それとも JPA などを使用できますか?

それでも確信がある場合は、このように設定を延期するカスタムオブジェクトを使用できます

// [some code that is about to set the property on thirdLevelObject
Runnable deferredSetter = new Runnable() {
    public void run() {
         thirdLevelObject.setFoo(/* wherever the value for foo comes from later */);
    }
} 

これらの遅延セッターRunnableは、後の初期化中にループするコレクションに追加できます。ただし、設計を単純化することで、このアプローチを回避できると思います。

于 2012-10-13T15:28:24.647 に答える