2013-11-14 8 views
0

В рамках определенного класса (активы), у меня есть ряд связанных переменных следующим образом:Java - Итерация через связанные переменные?

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

... список можно продолжить.

Логически, я знаю, что все они связаны, поэтому я хочу добавить все эти переменные и отобразить сумму. То, что я не хочу делать, это ввести вручную

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

и пр. Я чувствую, что должен быть лучший способ сделать это.

Итак, есть ли? Я думаю, что должен быть способ определить какой-то произвольный набор или коллекцию, и просто скажите Java, чтобы пройти через него и добавить все его члены. Должен ли я создать другой класс под названием «Балансы» или что-то со всеми этими переменными в качестве атрибутов? В противном случае я рассматривал использование массива, но это кажется хакерским.

Спасибо!

ответ

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()); 
    } 
} 

Выход

Это не заботится о типах, хотя: если вы бы целое число, которое заканчивается 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; 
    } 
} 
+0

Это очень впечатляет. Спасибо, что показали мне, как обращаться к именам полей; так как все заканчивается Балансом, я могу определенно проработать это так. – Ivan

+0

@ivan: Нет проблем, удачи. –

+0

@JeroenVannevel Использование отражения таким образом кажется необычайно плохим. Это требует, чтобы все последующие разработчики знали о соглашении об именах, которое они, скорее всего, не ищут. Если я продлю этот класс и добавлю «визу» или «кредит», я должен убедиться, что я переопределяю total(). Что, если я фактически использую его соглашение об именах и, поскольку это кажется настолько очевидным, переопределите total(), чтобы добавить мои значения в микс? OH NO Двойной счет! – InfernalRapture

1

Для этого необходимы структуры данных.

Вы можете либо составить список, либо карту для всех этих значений, если вы хотите часто перебирать их. В вашем примере карта, называемая Balances, кажется подходящей.

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

Конечно, это чисто дизайнерское решение.

1

вы можете использовать Java отражение, чтобы найти поле класса:

How to get the fields in an Object via reflection?

Если это один или несколько классов, которые вы создали, я 'введите его и сделайте. Если это произвольный класс, где вы не знаете, какие поля или сколько, отражения - это путь.

2

Я собираюсь предположить, что вы исходите из фона LISPy. То, что вы ищете, не существует в java.

Вы можете создать класс, чтобы его обернуть. Вы можете создать список активов и иметь функцию, которая выполняет итерацию по списку. Однако в коллекциях java нет никакого поведения на основе карты.

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

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

Метод HashMap предполагает, что вы хотите, чтобы иметь возможность получить имя или что-то.Если у самого актива нет неотъемлемой ценности, требующей, чтобы он был отличным, вы сделали бы текущую сумму. EnumMap будет работать очень хорошо, я думаю, если ваши активы ограничены. – InfernalRapture

Смежные вопросы