在特定的类(资产)中,我有一系列相关的变量,如:
private long checkingBalance;
private long savingsBalance;
private long moneyMarketBalance;
......列表继续。
逻辑上,我知道它们都是相关的,所以我想将所有这些变量相加并显示总和。我不想做的是手动输入
total = checkingBalance + savingsBalance + moneyMarketBalance + indexFundBalance + mutualFundBalance + whatever
等等。我觉得必须有更好的方法来做到这一点。
那么,有吗?我认为必须有一种方法来定义某种任意的集合或集合,并告诉Java循环遍历它并将其所有成员加起来。我应该创建另一个名为Balances的类,还是将所有这些变量作为属性?否则我考虑使用数组,但这似乎是hackish。
谢谢!
答案 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;
}
}