将路径存储到setter方法,以便以后可以调用它

时间:2012-10-13 14:56:13

标签: java

 public class TopLevelObject{

    List<SecondLevelObject> secondLevelObjects;
    Long field;

}

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

}

public class ThirdLevelObject{
     Long field1;
     Long field2;

}

我们有一个TopLevelObject,它包含一个SecondLevelObjects列表,所有这些都包含ThirdLevelObjects列表

我们需要通过迭代来初始化此结构的某些字段,并推迟初始化其他字段,但避免重复迭代

那么可以将引用/路径存储到该字段的setter以便稍后调用它们吗? (假设你可以知道在什么时候打电话给谁)

2 个答案:

答案 0 :(得分:0)

我建议最好在需要时使用Apache BeanUtils.PropertyUtils根据路径调用setter。下面列出了一些使用方法:

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)

答案 1 :(得分: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 */);
    }
} 

这些延迟的setter Runnable可以添加到您在稍后初始化期间循环的集合中。但我仍然认为你可以通过简化你的设计来避免这种方法。