我有一个关于基本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...
}
}
答案 0 :(得分:3)
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...
}
答案 1 :(得分:1)
您可以使用java反射:Class.getDeclaredFields()
(http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getDeclaredFields%28%29)并检查生成的字段数组。
答案 2 :(得分:1)
将大小数存储在列表或地图中。或者使用反射,但这会使事情变得不必要地复杂化。
答案 3 :(得分:1)
作为Reflection API的替代方案,您可以查看 java.beans 包中的BeanInfo类或来自的BeanMap类Apache BeanUtils项目。
使用 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链接到: Introspector,PropertyDescriptor
答案 4 :(得分:0)
您可以考虑首先使用其他数据结构,也就是说,如果价格以某种方式相关,您可以将它们存储在数组中并迭代它。或者你可以尝试像
这样的东西for (BigDecimal number:new BigDecimal[]{largeDto.getPrice1(), largeDto.getPrice2(), ...}} {...}