2011-07-18 22 views
70
動態名稱變量

我想在java中指派一組變量,如下所示:分配在Java

int n1,n2,n3; 

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

我如何在Java中實現這一目標?

+0

你能否澄清你的問題? –

+3

你需要爲局部變量做這個嗎?爲什麼不是數組元素? –

+0

@ Eng.Fouad:我想動態地通過名字訪問變量。 –

回答

87

這不是你如何在Java中做事。 Java中沒有動態變量。 Java變量必須在源代碼(*)中聲明。期。

根據您要達到的目標,您應該使用數組,ListMap;例如

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

它可以使用反射動態指已在源代碼中被聲明變量。但是,此只有適用於作爲類成員(即靜態和實例字段)的變量。它不適用於局部變量。請參閱@ fyr的「快速和骯髒」示例。

然而,在Java中不必要地做這種事情是一個壞主意。它效率低下,代碼更復雜,並且由於您依賴運行時檢查,所以它更脆弱。

而這不是「具有動態名稱的變量」。它更好地描述了對具有靜態名稱的變量的動態訪問。


* - 該聲明有些不準確。如果使用BCEL或ASM,則可以在字節碼文件中「聲明」變量。但不要這樣做!這種方式就是瘋狂!在Java中

+0

非常感謝,得到了我正在尋找的東西。最後一部分(Map )。 –

+1

應該指出,即使這是可能的,它不應該是你實際上做的事情。你不會從中獲得任何收益;你實際上會失去可讀性。如果你想鏈接它們,可以使用'Map '來代替,不要開始搞亂你的實際代碼。 –

+2

@JeroenVannevel - 這就是我的意思是「瘋狂」:-) –

9

您應該使用Listarray代替

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

或者

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

甚至更​​好

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

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

你需要的是命名的數組。我想寫下面的代碼:

int[] n = new int[4]; 

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

不想使用數組。我想根據某些條件動態訪問變量(n1,n2,n3)。 –

3

動態變量名
有沒有這樣的事情。

你的情況,你可以使用數組:

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

對於更一般(name, value)對,使用Map<>

3

試試這個方法:

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

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

如果你想要一些訪問的變量您可以使用反射來進行動態排序。然而,反射不適用於局部變量。它只適用於類屬性。

粗略的快速和骯髒的例子是這樣的:

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

您需要提高以各種方式驗證碼這只是一個例子。這也不被認爲是好的代碼。

+2

當您需要將Android的傳感器event.values []轉換爲一組變量時非常出色。 event.values []的長度可以從1到6,它可以方便地進行轉換,對於無數組的json封送處理。 –

2

你不知道。您可以做的最接近的事情是使用Google Maps來模擬它,或者定義您自己的對象來處理。