Gán các biến có tên động trong Java


96

Tôi muốn gán một tập hợp các biến trong java như sau:

int n1,n2,n3;

for(int i=1;i<4;i++)
{
    n<i> = 5;
}

Làm cách nào để đạt được điều này trong Java?


1
Bạn có thể vui lòng làm rõ câu hỏi của bạn?
Eng.Fouad

4
Bạn cần làm điều này cho các biến cục bộ? Tại sao không phải là phần tử mảng?
Ray Toal

@ Eng.Fouad: Tôi muốn truy cập động các biến theo tên của chúng.
Ashish Anand

@Ashish Anand được bạn có nghĩa stackoverflow.com/questions/6629995/...
mKorbel

Câu trả lời:


111

Đây không phải là cách bạn làm mọi thứ trong Java. Không có biến động nào trong Java. Các biến Java phải được khai báo trong mã nguồn 1 .

Tùy thuộc vào những gì bạn đang cố gắng đạt được, bạn nên sử dụng một mảng, a Listhoặc a Map; ví dụ

int n[] = new int[3];
for (int i = 0; i < 3; i++) {
    n[i] = 5;
}

List<Integer> n = new ArrayList<Integer>();
for (int i = 1; i < 4; i++) {
    n.add(5);
}

Map<String, Integer> n = new HashMap<String, Integer>();
for (int i = 1; i < 4; i++) {
    n.put("n" + i, 5);
}

Có thể sử dụng phản xạ để tham chiếu động đến các biến đã được khai báo trong mã nguồn. Tuy nhiên, điều này chỉ hoạt động đối với các biến là thành viên lớp (tức là trường tĩnh và trường thể hiện). Nó không hoạt động đối với các biến cục bộ. Hãy xem ví dụ về "nhanh và bẩn" của @ fyr.

Tuy nhiên, làm điều này một cách không cần thiết trong Java là một ý tưởng tồi. Nó không hiệu quả, mã phức tạp hơn và vì bạn đang dựa vào việc kiểm tra thời gian chạy nên nó dễ hỏng hơn. Và đây không phải là "các biến có tên động". Nó được mô tả tốt hơn là truy cập động vào các biến có tên tĩnh.


1 - Tuyên bố đó hơi không chính xác. Nếu bạn sử dụng BCEL hoặc ASM, bạn có thể "khai báo" các biến trong tệp bytecode. Nhưng đừng làm vậy! Đó là sự điên rồ!


1
Thanx rất nhiều, đã có những gì tôi đang tìm kiếm. Phần cuối cùng (Bản đồ <Chuỗi, số nguyên>).
Ashish Anand

1
Cần lưu ý rằng ngay cả khi điều đó có thể xảy ra, đó không phải là điều bạn thực sự sẽ làm. Bạn không thu được gì từ nó; bạn sẽ thực sự mất khả năng đọc. Nếu bạn muốn liên kết chúng, hãy sử dụng mã Map<String, T>thay thế, đừng bắt đầu làm rối với mã thực của bạn.
Jeroen Vannevel

2
@JeroenVannevel - Đó là ý của tôi khi nói về "sự điên rồ" :-)
Stephen C

35

Nếu bạn muốn truy cập các biến một số loại động, bạn có thể sử dụng phản xạ. Tuy nhiên Reflection không hoạt động đối với các biến cục bộ. Nó chỉ có thể áp dụng cho các thuộc tính của lớp.

Một ví dụ thô sơ và nhanh chóng là:

public class T {
    public Integer n1;
    public Integer n2;
    public Integer n3;

    public void accessAttributes() throws IllegalArgumentException, SecurityException, IllegalAccessException,
            NoSuchFieldException {

        for (int i = 1; i < 4; i++) {
            T.class.getField("n" + i).set(this, 5);
        }
    }
}

Bạn cần cải thiện mã này theo nhiều cách khác nhau, nó chỉ là một ví dụ. Đây cũng không được coi là mã tốt.


3
Tuyệt vời khi bạn cần chuyển đổi event.values ​​[] cảm biến của Android thành một tập hợp các biến. event.values ​​[] có thể có độ dài từ 1 đến 6 và rất tiện lợi khi chuyển đổi nó, trong trường hợp của tôi là đối với một json marshaling không có mảng.
Farshid T

12

Những gì bạn cần là mảng được đặt tên. Tôi muốn viết mã sau:

int[] n = new int[4];

for(int i=1;i<4;i++)
{
    n[i] = 5;
}

1
Không muốn sử dụng mảng. Tôi muốn truy cập động các biến (n1, n2, n3) tùy thuộc vào một số điều kiện.
Ashish Anand vào

10

Bạn nên sử dụng Listhoặc arraythay thế

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);

Hoặc là

int[] arr  = new int[10];
arr[0]=1;
arr[1]=2;

Hoặc thậm chí tốt hơn

Map<String, Integer> map = new HashMap<String, Integer>();
map.put("n1", 1);
map.put("n2", 2);

//conditionally get 
map.get("n1");

7

Tên biến động trong Java
Không có điều đó.

Trong trường hợp của bạn, bạn có thể sử dụng mảng:

int[] n = new int[3];
for() {
 n[i] = 5;
}

Đối với (name, value)các cặp tổng quát hơn , hãy sử dụngMap<>


4

Hãy thử cách này:

    HashMap<String, Integer> hashMap = new HashMap();

    for (int i=1; i<=3; i++) {
        hashMap.put("n" + i, 5);
    }

4

Bạn không. Điều gần nhất bạn có thể làm là làm việc với Maps để mô phỏng nó hoặc xác định Đối tượng của riêng bạn để xử lý.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.