0

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

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

......名单还在继续。

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

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

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

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

谢谢!

4

5 回答 5

2

我猜你来自 LISPy 背景。你要找的东西在java中不存在。

您当然可以创建一个类来包装它。您可以创建一个资产列表,并拥有一个遍历列表的函数。不过,Java 集合中没有本地映射到行为。

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

int total(){
   int total=0;
   for(Integer x: assets.values()){
       total+= x;
   }
   return total;
}
于 2013-11-14T03:40:03.997 回答
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;
    }
}
于 2013-11-14T03:45:18.297 回答
1

这就是数据结构的用途。

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

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

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

于 2013-11-14T03:39:04.203 回答
1

使用反射 API 是一种方法(http://docs.oracle.com/javase/tutorial/reflect/member/fieldTypes.html

于 2013-11-14T03:39:10.447 回答
1

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

如何通过反射获取对象中的字段?

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

于 2013-11-14T03:39:24.380 回答