java - 为什么这个缓存不能使用 final 作为修饰符

标签 java caching object final

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

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

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

最佳答案

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 ,但它不适用于 Java,除非您使用 volatile 变量,并且它 ends up just being better 继续并同步。)

关于java - 为什么这个缓存不能使用 final 作为修饰符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2845516/

相关文章:

java - 单一职责原则在特定代码上的实现

ios - 无法从我的应用程序中删除 testflight sdk

javascript - Jquery-从 HTML 表创建 JavaScript 对象

android - 使用改造缓存特定响应

iis - 如何让 IIS 为我的 favicon.ico 发布缓存 header ?

javascript - 在javascript中访问扩展对象

c++ - 与另一个类 C++ 共享对象

java - 如何在 plain eclipse 中添加 Java EE 插件

java - 在java中,当将带有空格的char数组转换为字符串时,如何删除该字符串中的空格?

java - 我有一个 double 组,我需要获得中位数,但它一直给我一个 int 转换错误