2

我有一个关于基本 java 的问题。我有一个类,它有很多 bigdecimal 成员。我想通过循环迭代这个类的所有成员。有什么办法吗?

public class LargeDTO extends CoreDTO {
    private BigDecimal price1;
    private BigDecimal price2;
    private BigDecimal price3;
    private BigDecimal price4;
    private BigDecimal price5;
    private BigDecimal price6;
    ...
    // getter & setter
}

public class UseLoop{
    LargeDTO largeDTO = fillLatgeDTO();
    BigDecimal total = BigDecimal.Zero;
    // Is it possible ?
    for(each member of largeDTO){
         total = total.add(largeDTO.getCurrentMember()); // price1, price2...
    }
}
4

5 回答 5

3

利用Class#getDeclaredFields

Field[] fields = LargeDTO.class.getDeclaredFields();

或者将您当前的设计更改为具有一个List<BigDecimal> prices而不是具有相同类型的 6 个字段。

public class LargeDTO extends CoreDTO {
    private List<BigDecimal> prices;

    public LargeDTO() {
        prices = new ArrayList<BigDecimal>();
    }

    //getter and setter for your prices
}

//in client class...
LargeDTO largeDTO = new LargeDTO();
//fill the data...
for(BigDecimal price : largeDTO.getPrices()) {
    //do what you want/need...
}
于 2013-08-04T20:27:18.327 回答
1

您可以使用 java 反射:(Class.getDeclaredFields()http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getDeclaredFields%28%29 并检查生成的字段数组。

于 2013-08-04T20:27:38.787 回答
1

将大小数存储在列表或地图中。或者使用反射,但这会使事情变得不必要的复杂恕我直言。

于 2013-08-04T20:28:14.267 回答
1

作为反射 API 的替代方案,您可以查看java.beans包中的BeanInfo类或Apache BeanUtils项目中的BeanMap类。

使用BeanInfo

for (PropertyDescriptor propDesc :
             Introspector.getBeanInfo(LargeDTO.class).getProperyDescriptors()) {
     total = total.add((BigDecimal) propDesc.getReadMethod().invoke(largeDTO));
}

使用BeanMap

for (Object price : new BeanMap(largeDTO).valueIterator()) {
     total = total.add((BigDecimal) price);
}

Java Doc 链接到:
IntrospectorPropertyDescriptor

于 2013-08-04T21:18:11.457 回答
0

您可以首先考虑使用另一种数据结构,也就是说,如果价格以某种方式相关,您可以将它们存储在一个数组中并对其进行迭代。或者你可以尝试类似的东西

for (BigDecimal number:new BigDecimal[]{largeDto.getPrice1(), largeDto.getPrice2(), ...}} {...}
于 2013-08-04T20:27:03.793 回答