1

我有这段代码可以为这个实例获取一次光标,日志显示它被调用了很多次,尽管我标记为最终的。我错过了什么?

 private Cursor getAllContactsCached() {
        final Cursor c=this.getList();
        return c;
    }

getAllContactsCached 方法应该检索一次列表,第二次应该重用最终对象返回

4

2 回答 2

4

Java 在函数中没有静态局部变量(就像 C 一样);final意味着与您正在做的事情完全不同的事情。

获得这种静态的唯一方法是使用实​​例或类成员,例如:

class Foo {
    private Cursor theCursor;

    private synchronized Cursor getAllContactsCached() {
        if (this.theCursor == null) {
            this.theCursor = this.getList();
        }
        return this.theCursor;
    }
}

(这是特定于实例的方式;您也可以以类范围的方式执行此操作,但我猜这不适合Cursor.)

请注意,整个方法是同步的。如果您只有一个游标实例至关重要,这一点很重要。如果它只是一种优化,而不是关键,你可以忍受竞争条件而不是同步,在这种情况下,你最终可能会得到函数返回的两个不同的游标。(您可能很想使用双重检查锁定习惯用法volatile,但除非您使用变量,否则它不适用于 Java ,而且它最终会更好地继续进行同步。)

于 2010-05-16T21:26:10.537 回答
-1

没有。final表示你保证不会改变它。如果您希望它不更改,则需要将其设为静态或类成员。

于 2010-05-16T21:21:12.973 回答