【问题标题】:Error in code snippet in documentation - Cannot refer to non-final variable文档中的代码片段错误 - 无法引用非最终变量
【发布时间】:2014-06-18 19:52:53
【问题描述】:

我正在开发使用 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);
            }
        });
    }
});

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

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

上线ParseObject.pinAllInBackground("highScores", scores);

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

我的想法

  1. 通过在 done 方法中创建局部最终变量,例如final List&lt;ParseObject&gt; localScores = scores 然后在pinAllInBackground 中使用它
  2. 通过将done 方法的签名更改为public void done(finalList&lt;ParseObject&gt; scores, ParseException e)

这两个选项似乎都有效。

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

我个人对选项 2. 起作用感到惊讶,但似乎 final 修饰符不会导致方法重载 - 这里很好地证明了我对 Java 缺乏更深入的了解 :-)

附:让我们抛开官方文档包含非工作代码 sn-ps 的事实。

【问题讨论】:

    标签: java android parse-platform


    【解决方案1】:

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

    final 参数不会更改从调用者看到的方法的签名(签名由方法的名称及其形式参数的类型定义,请参阅@ 987654321@)。只是为了实现上述方法,这意味着变量不能被赋予新的值。

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

    【讨论】:

    • 感谢您的澄清。我知道我很久以前在大学里听说过这件事:-)
    猜你喜欢
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    相关资源
    最近更新 更多