Почему этот кеш не работает, используя final в качестве модификатора - PullRequest
1 голос
/ 17 мая 2010

У меня есть этот код, чтобы получить Курсор один раз для этого экземпляра, и журнал показывает, что он вызывается много раз, хотя я пометил как финальный. Чего мне не хватает?

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

Метод getAllContactsCached должен получить список один раз, а во второй раз он должен повторно использовать конечный объект для возврата

Ответы [ 2 ]

4 голосов
/ 17 мая 2010

Java не имеет статических локальных переменных в функциях (как в C); final означает нечто совершенно отличное от того, что вы делаете.

Единственный способ получить статический тип - использовать экземпляр или член класса, например ::10000

class Foo {
    private Cursor theCursor;

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

(Это специфичный для экземпляра способ; вы также можете сделать это для всего класса, но я предполагаю, что это не подходит для Cursor.)

Обратите внимание, что весь метод синхронизирован. Это важно, если крайне важно , чтобы у вас был только один экземпляр курсора. Если это всего лишь оптимизация, и не имеет решающего значения, вы можете жить с условием гонки и не синхронизироваться, и в этом случае вы можете получить два разных курсора, возвращаемых функцией. (Вы можете испытать желание использовать дважды проверенную идиому блокировки , но она не работает с Java, если вы не используете переменную volatile, и она в конечном итоге становится просто лучше идти вперед и синхронизировать.)

0 голосов
/ 17 мая 2010

Неа. final означает, что вы обещаете не менять его. Если вы хотите, чтобы это не изменилось, вам нужно либо сделать его статическим, либо членом класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...