0

我有一个类角色:

String name;
Int age;

我有一个ArrayList<Persona>,然后

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

当循环结束时,我想获得这个 Persona 之一,但 Eclipse IDE 对我说,要使用get(i)我必须声明 ArrayList 之类final的,如果这样做,我无法填充它。

这是代码:

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 问题。

4

3 回答 3

1

final与 C++ 不同const。声明personasfinal引用并不会阻止您更改引用所引用的对象。

于 2012-10-29T13:03:58.467 回答
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){}
于 2012-10-29T13:02:22.093 回答
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

于 2012-10-29T13:11:59.070 回答