簡體   English   中英

以名稱String形式訪問Java變量

[英]Access Java variable by its name as a String

我已經聲明了10個名為arraylist1arraylist2 ArrayList ,依此類推。

我想在for循環中動態更改變量名稱:

for (int i = 1; i < 5; i++)
{
   arraylist + (i).clear();
   //arraylist1.clear();
   //arraylist2.clear();
   //arraylist3.clear();
   //arraylist4.clear();
   //arraylist5.clear();

}

可能嗎? 如果是這樣的格式是什么?

您無法使用其名稱作為字符串來處理變量(除了反射,但這對此任務來說太過分了)。

您可以將所有這些ArrayList添加到另一個List。 這更靈活,因此是更好的選擇。

List<List<ContactDetails>> lists2 = new ArrayList<List<String>>();
for (int i = 0; i < 10; i++) {
    lists2.add(new ArrayList<ContactDetails>());
}

或者將它們添加到數組並通過數組索引訪問它們:

@SuppressWarnings("unchecked")
List<ContactDetails>[] lists = new List[10];
for (int i = 0; i < lists.length; i ++) {
    lists[i] = new ArrayList<ContactDetails>();
}

現在:

for (int i = 1; i < 5; i++)
{
   lists[i].clear();
   lists2.get(i).clear();
}

由於List和數組都是Iterable ,您可以使用foreach語法:

for (List list : lists)
{
   list.clear();
}

for (List list : lists2) {
    list.clear();
}

如果您知道如何使用Lambdas / Stream API實現相同功能,請添加答案。

如果ArrayList是類屬性,則可以使用反射來實現:

((ArrayList) getClass().getField("arraylist" + i).get(this)).clear();

你也可以用反射做到這一點。 但我不推薦它。

public class SoTest {

    @Test
    public void testWithReflection() throws Exception {
        final MyClass myClass = new MyClass();
        for (int i = 0; i < 10; i++) {
            final Field field = myClass.getClass().getDeclaredField("list" + i);
            field.setAccessible(true);
            final List<String> value = (List<String>) field.get(myClass);
            value.clear();
        }
    }

    class MyClass {
        private List<String> list0 = new ArrayList<>();
        private List<String> list1 = new ArrayList<>();
        private List<String> list2 = new ArrayList<>();
        private List<String> list3 = new ArrayList<>();
        private List<String> list4 = new ArrayList<>();
        private List<String> list5 = new ArrayList<>();
        private List<String> list6 = new ArrayList<>();
        private List<String> list7 = new ArrayList<>();
        private List<String> list8 = new ArrayList<>();
        private List<String> list9 = new ArrayList<>();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM