Java - 迭代相关变量?

时间:2013-11-14 03:34:39

标签: java oop reflection

在特定的类(资产)中,我有一系列相关的变量,如:

private long checkingBalance;
private long savingsBalance;
private long moneyMarketBalance;

......列表继续。

逻辑上,我知道它们都是相关的,所以我想将所有这些变量相加并显示总和。我不想做的是手动输入

total = checkingBalance + savingsBalance + moneyMarketBalance + indexFundBalance + mutualFundBalance + whatever 

等等。我觉得必须有更好的方法来做到这一点。

那么,有吗?我认为必须有一种方法来定义某种任意的集合或集合,并告诉Java循环遍历它并将其所有成员加起来。我应该创建另一个名为Balances的类,还是将所有这些变量作为属性?否则我考虑使用数组,但这似乎是hackish。

谢谢!

5 个答案:

答案 0 :(得分:2)

我猜你是来自LISPy的背景。您正在寻找的内容在java中不存在。

你当然可以创建一个包装它的类。您可以创建资产列表,并具有迭代列表的函数。但是,在Java集合中没有本地映射到行为。

Map<String,Integer> assets = new HashMap();

int total(){
   int total=0;
   for(Integer x: assets.values()){
       total+= x;
   }
   return total;
}

答案 1 :(得分:1)

这就是数据结构的用途。

如果要频繁地迭代它们,您可以为所有这些值创建列表或地图。在您的示例中,名为Balances的地图似乎是合适的。

private Map<String, Long> balances = new HashMap<String, Long>();
balances.put('someBalance', new Long(0));

当然,这纯粹是一个设计决定。

答案 2 :(得分:1)

答案 3 :(得分:1)

您可以使用Java反射来查找类的字段:

How to get the fields in an Object via reflection?

如果是您创建的一个或几个类,我会输入并完成。如果它是一个任意的类,你不知道哪些字段或多少字段,那么反射是最佳选择。

答案 4 :(得分:1)

public class Test {
    private long xBalance = 5L;
    private long yBalance = 10L;
    private long nuhuh = 20L;

    public long getTotal() throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException{
        long result = 0L;
        for(Field field : this.getClass().getDeclaredFields()){
            if(field.getName().endsWith("Balance")){
                result += (long) field.get(this);
            }
        }
        return result;
    }

    public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException {
        System.out.println(new Test().getTotal());
    }
}

输出

  

15

这并不关心类型:如果你有一个以Balance结尾的整数,它会抛出异常。您始终可以添加代码以查找该内容。

然后,你可以再创建一个集合并将所有内容存储在那里:

class Test {
    private Map<String, Long> myBalances = new HashMap<>();

    {
       myBalances.put("savings", 500L);
    }

    public long getSavingsBalance(){
      return myBalances.get("savings");
    }

    public long getTotal(){
      long result = 0L;
      for(long value : myBalances.values()){
         result += value;
      }
      return result;
    }
}