В Java, возможно ли объединить значение переменной в имя переменной (звуки испорчены, но, пожалуйста, прочтите подробности) - PullRequest
2 голосов
/ 26 октября 2011

В основном у меня есть переменная, zlort = one;

Я хочу объединить значение zlort в имя переменной (ссылка на объект).

Как

BankAccount Accountzlort = new BankAccount;

Я хочу, чтобы zlort в Account.zlort на самом деле был заменен значением zlort (один - это означает, что я хочу, чтобы значение было Accountone), а не сам zlort.

Возможно ли это сделать?

Спасибо!

Ответы [ 4 ]

11 голосов
/ 26 октября 2011

Нет, вы не можете, но вы можете поместить экземпляр на карту:

Map<String,BankAccount> map = new HashMap<String,BankAccount>();
map.put("Account" + zlort, new BankAccount());
7 голосов
/ 26 октября 2011

Если вы имеете в виду динамический выбор имени для присвоения переменной, то нет.

Вы можете использовать HashMap для достижения того же эффекта.

2 голосов
/ 26 октября 2011

Невозможно изменить имя переменной во время выполнения. Это может привести к серьезным проблемам безопасности и стабильности при работе с любым реальным приложением.

Однако, как уже упоминалось в двух ответах, HashMap может достичь того, что вы ищете. (См. Javadoc !!)

A HashMap (или любая другая карта в этом отношении) отображает ключ в значение . Концепция похожа на переменную, которая является name -> value mapping. Единственное отличие состоит в том, что переменные являются частью фактического программного кода, который практически невозможно изменить после компиляции. Map - это структура данных, которая может быть изменена запущенной программой. Это позволяет вам свободно добавлять пары ключ-значение.

Обратите внимание, что в Java безопасность типов поощряется за счет использования Generics. В основном это гарантирует, что ключ может быть только одного типа (например, String), а значение может быть только одного типа (BankAccount). Подробное описание дженериков можно найти здесь .

Вы бы заявили об этом следующим образом:

Map<String, BankAccount> accounts = new HashMap<String, BankAccount>();

А затем, чтобы добавить пару ключ-значение на карту, вы должны использовать метод put() (который «помещает» значение в карту, связанное с ключом)

String key = "Key"
BankAccount value = new BankAccount();
accounts.put(key, value);

Чтобы получить его, вы должны использовать метод get().

BankAccount retrievedValue;
retrievedValue = accounts.get(key);
0 голосов
/ 26 октября 2011

После прочтения пояснений в ваших комментариях, тот факт, что вы не можете использовать массив, но можете использовать `ArrayList '...

Вместо создания нового имени переменной (или элемента массива, илизначение карты) для каждого BankAccount вы, вероятно, можете использовать область действия в своих интересах.

Область действия - это концепция, согласно которой ссылка на переменную имеет значение только в определенной части кода.Если вы объявите переменную внутри метода, эту переменную можно увидеть только внутри этого метода.Переменная, объявленная в блоке (цикл, оператор if и т. Д.), Видна только из этого блока.

Поля класса имеют различную область видимостиэто можно настроить с помощью ключевых слов ( см. здесь ).

Например:

public class ScopeExample

    int classInt = 10;

    public void method() {
        int methodInt = 0; // This integer can only be seen by code in 
                           // this method
    }

    public void method2() {
        //doSomething(methodInt) // This line won't compile because i is 
                                 // declared in a different method!
        doSomething(classInt); // This line will compile and work 
                               // because x is declared in the class that 
                               // contains this method.
        int index = 0;
        while (index < 3) {
            int whileInt = index; // This integer can only be seen from within 
                                  // this while loop! It is created each 
                                  // loop iteration.
            doSomething(whileInt);
        }
        doSomething(whileInt); //This line won't work, whileInt is out of scope!
    }

    public doSomething(int a) {
        System.out.println(a);
    }

}

ТАК!Если вы создаете объект BankAccount в цикле, вам не нужно беспокоиться о создании нового имени для следующего.Каждый раз, когда цикл повторяется, он становится новым объектом (когда вы его создаете).

Если вам нужно его сохранить, вам определенно потребуется использовать массив или другую структуру данных (ArrayList!).

Основываясь на идее области действия, вы можете иметь одинаковое имя переменной для каждого нового BankAccount.Ссылка на переменную не гарантируется в паре с объектом, на который она ссылается.Это удобно для программиста, так что вам не нужно знать точный адрес памяти, в котором он хранится.

Например:

public static void main(String[] args) {

    Object o;
    int i = 0;
    while (i < 5) {
        Object reference = new Object(); // Create a new Object and store 
                                         // it in 'reference'
        o = obj; // The Object 'o' now refers to the object in 'reference'
        i++;
    }
    System.out.println(o); // This should print information about the 
                           // LAST object created.
}

Новый созданный Objectв цикле не принадлежит к 'obj'.Вы, как программист, используете obj, чтобы указать на Object.Программа на самом деле не знает, что означает объект, кроме того факта, что он указывает на объект, который вы просто created.

Наконец, вы можете использовать это вместе с ArrayList, чтобы сделать вашу жизнь проще.

public static void main(String[] args) {

    // Our new ArrayList to hold our objects!
    ArrayList<Object> stuff = new ArrayList<Object>();

    int i = 0;
    while (i < 5) {
        Object obj = new Object(); // Create an object and make obj point to it.
        stuff.add(obj); // Put "the object that 'obj' points to" in 'stuff'.
        i++;
    }

    // This loop goes through all of the Objects in the ArrayList and prints them
    for (int index = 0; index < stuff.size(); index++) {
        System.out.println(stuff.get(i)); // This will print a single 
                                          // object in the ArrayList each time.
    }
}
...