Menetapkan variabel dengan nama dinamis di Java

96

Saya ingin menetapkan satu set variabel di java sebagai berikut:

int n1,n2,n3;

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

Bagaimana saya bisa mencapai ini di Jawa?

Ashish Anand
sumber
1
Bisakah Anda menjelaskan pertanyaan Anda?
Eng. Fouad
4
Anda perlu melakukan ini untuk variabel lokal? Mengapa tidak elemen array?
Ray Toal
@ Eng.Fouad: Saya ingin mengakses variabel dengan namanya secara dinamis.
Ashish Anand
@Ashish Anand maksudmu stackoverflow.com/questions/6629995/…
mKorbel

Jawaban:

111

Ini bukan cara Anda melakukan sesuatu di Java. Tidak ada variabel dinamis di Java. Variabel Java harus dideklarasikan dalam kode sumber 1 .

Bergantung pada apa yang ingin Anda capai, Anda harus menggunakan array, a Listatau a Map; misalnya

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

Refleksi dapat digunakan untuk secara dinamis merujuk ke variabel yang telah dideklarasikan dalam kode sumber. Namun, ini hanya berfungsi untuk variabel yang merupakan anggota kelas (yaitu bidang statis dan instance). Ini tidak berfungsi untuk variabel lokal. Lihat contoh "cepat dan kotor" @ fyr.

Namun melakukan hal semacam ini secara tidak perlu di Java adalah ide yang buruk. Ini tidak efisien, kodenya lebih rumit, dan karena Anda mengandalkan pemeriksaan runtime, ini lebih rapuh. Dan ini bukan "variabel dengan nama dinamis". Ini lebih baik dijelaskan sebagai akses dinamis ke variabel dengan nama statis.


1 - Pernyataan itu sedikit tidak akurat. Jika Anda menggunakan BCEL atau ASM, Anda dapat "mendeklarasikan" variabel dalam file bytecode. Tapi jangan lakukan itu! Begitulah letak kegilaan!

Stephen C
sumber
1
Terima kasih banyak, dapatkan apa yang saya cari. Bagian terakhir (Map <String, integer>).
Ashish Anand
1
Perlu dicatat bahwa meskipun memungkinkan, itu seharusnya tidak menjadi sesuatu yang benar-benar Anda lakukan. Anda tidak mendapatkan apa-apa darinya; Anda benar-benar akan kehilangan keterbacaan. Jika Anda ingin menautkannya, gunakan a Map<String, T>, jangan mulai mengotak-atik kode Anda yang sebenarnya.
Jeroen Vannevel
2
@JeroenVannevel - Itulah yang saya maksud dengan "kegilaan" :-)
Stephen C
35

Jika Anda ingin mengakses variabel semacam dinamika, Anda dapat menggunakan refleksi. Namun Refleksi tidak berfungsi untuk variabel lokal. Ini hanya dapat diterapkan untuk atribut kelas.

Contoh kasar dan cepat kotor adalah ini:

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

Anda perlu memperbaiki kode ini dengan berbagai cara, ini hanya contoh. Ini juga tidak dianggap sebagai kode yang baik.

fyr
sumber
3
Sangat baik ketika Anda perlu mengonversi event.values ​​[] sensor Android menjadi satu set variabel. event.values ​​[] bisa memiliki panjang dari 1 hingga 6 dan berguna untuk mengubahnya, dalam kasus saya untuk json marshaling tanpa array.
Farshid T
12

Yang Anda butuhkan bernama array. Saya ingin menulis kode berikut:

int[] n = new int[4];

for(int i=1;i<4;i++)
{
    n[i] = 5;
}
AlexR
sumber
1
Tidak ingin menggunakan array. Saya ingin mengakses variabel secara dinamis (n1, n2, n3) tergantung pada beberapa kondisi.
Ashish Anand
10

Anda harus menggunakan Listatau arraysebagai gantinya

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

Atau

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

Atau bahkan lebih baik

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

//conditionally get 
map.get("n1");
Jigar Joshi
sumber
7

Nama Variabel Dinamis di Jawa
Tidak ada hal seperti itu.

Dalam kasus Anda, Anda dapat menggunakan array:

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

Untuk (name, value)pasangan yang lebih umum , gunakanMap<>

Op De Cirkel
sumber
4

Coba cara ini:

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

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

sumber
4

Kamu tidak. Hal terdekat yang dapat Anda lakukan adalah bekerja dengan Maps untuk mensimulasikannya, atau menentukan Objek Anda sendiri untuk ditangani.

everton
sumber