为什么这个缓存不能使用final as modifier

时间:2010-05-16 21:17:52

标签: java caching object final

我有这个代码为这个实例获取Cursor一次,而Log显示它被多次调用,尽管我标记为final。我缺少什么?

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

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

2 个答案:

答案 0 :(得分: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。)

请注意,整个方法是同步的。如果至关重要你只有一个光标实例,那么这很重要。如果它只是一个优化,而不是至关重要的,你可以忍受竞争条件而不是同步,在这种情况下你最终会得到函数返回的两个不同的游标。 (您可能很想使用double-checked locking idiom,但除非您使用volatile变量,并且ends up just being better继续并同步,否则它不适用于Java。)

答案 1 :(得分:-1)

不。 final表示您保证不会更改它。如果您不想更改,则需要将其设置为静态或类成员。