文档中的代码片段出错 - 无法引用非最终变量

时间:2014-06-18 19:52:54

标签: java android parse-platform

我正在使用Parse.com作为后端处理Android应用程序。

Parse的Android SDK文档在section related to the Local datastore feature中包含以下代码:

ParseQuery<ParseObject> query = ParseQuery.getQuery("GameScore");
query.orderByDescending("score");

// Query for new results from the network.
query.findInBackground(new FindCallback<ParseObject>() {
    public void done(List<ParseObject> scores, ParseException e) {
        // Remove the previously cached results.
        ParseObject.unpinAllInBackground("highScores", new DeleteCallback() {
            public void done(ParseException e) {
                // Cache the new results.
                ParseObject.pinAllInBackground("highScores", scores);
            }
        });
    }
});

但是,如果我在我的代码中尝试使用它,我会收到错误

  

不能引用内部类中的非最终变量分数   用不同的方法定义

ParseObject.pinAllInBackground("highScores", scores);

我明白问题可能是什么,问题是如何解决它。

我的想法

  1. 通过在done方法中创建局部最终变量,例如final List<ParseObject> localScores = scores然后在pinAllInBackground
  2. 中使用此功能
  3. done方法的签名更改为public void done( 最终 List<ParseObject> scores, ParseException e)
  4. 两种选择似乎都有效。

    我想从经验丰富的Java开发人员那里得到答案,如果一个选项比另一个更好,为什么?

    我个人对选项2的工作感到惊讶,但似乎final修饰符并没有导致方法重载 - 这里我对Java的深入了解得到了很好的证明: - )

    P.S。让我们不要理会官方文档包含非工作代码片段。

1 个答案:

答案 0 :(得分:2)

它更喜欢选项2,因为它可以为您节省变量声明。

final参数不会改变从调用者看到的方法签名(签名仅由 定义,方法名称及其形式参数的类型,见specification)。它仅用于实现所述方法,这意味着不能为变量分配新值。

在匿名内部类中使用它是必要的,因为Java不支持闭包。