如何获取非最终ArrayList的元素?

时间:2012-10-29 12:57:08

标签: java android arraylist final

我有一个班级Persona:

String name;
Int age;

我有一个ArrayList<Persona>,然后是

我用一个for循环填充ArrayList,add(new Persona(name,age))带有一个JSON解析数据(这个JSON解析是从一个PHP请求到一个返回随机数“Persona's”的MySQL数据库)。

当循环结束时,我想得到一个Persona,但Eclipse IDE告诉我要使用get(i)我必须声明像final这样的ArrayList,如果我这样做,我无法填写它。

这是代码:

ArrayList<Persona> personas = new ArrayList<Persona>();
JSONParser jParser = new JSONParser();
JSONObject json = jParser.getJSONFromUrl(url);

try {
    personas = json.getJSONArray(TAG);
    for(int i = 0; i < putas.length(); i++) {
        JSONObject c = personas.getJSONObject(i);
        String name = c.getString(TAG_NAME);
        Int age = c.getString(TAG_AGE);
        personas.add(new Persona(name, age));
} catch (...) {
    ...
}

int i = 4;
Persona p = personas.get(i);

使用此代码,IDE会向我显示错误并“提供”我将“final”修饰符添加到ArrayList,但这很荒谬。

PD:问题在于Android应用程序,但我认为这是一个Java问题。

3 个答案:

答案 0 :(得分:1)

final is not the same as C++ const。将personas声明为final引用并不会阻止您更改引用所引用的对象。

答案 1 :(得分:0)

尝试在try块中初始化数组List ...

 ArrayList<Persona> personas;
 JSONParser jParser;
 JSONObject json;
 try
 {
   personas = new ArrayList<Persona>();
   jParser = new JSONParser();
   json = jParser.getJSONFromUrl(url);

   // rest of the code
 }
 catch(Exception e){}

答案 2 :(得分:0)

除非你在那里final,否则没有理由不编译它。你必须遗漏一些东西。

无论哪种方式,final关键字只是意味着您不能再向该字段分配内容,而不是您无法调用其方法。

你是对的,如果你提出personas final,那么你的代码将无效,因为personas = json.getJSONArray(TAG)将不被允许。

由于您在编译时收到关于非最终版权的投诉,我假设您之后实际上有一些代码,使用personas。如果你想在这样的事情中使用它:

Runnable r = new Runnable() { public void run() { personas.get(0); } };

您可能正在为View听众做些什么。

那,需要你让它成为最终的。最简单的解决方案就是制作另一个局部变量,并将其作为最终变量。

final ArrayList<Persona> finalPersonas = personas