1

このインスタンスに対してカーソルを 1 回取得するためのこのコードがあり、最終としてマークしたにもかかわらず、ログはそれが何度も呼び出されたことを示しています。私は何が欠けていますか?

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

getAllContactsCached メソッドはリストを 1 回取得し、2 回目は最終的なオブジェクトを再利用して返す必要があります

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;
    }
}

(これはインスタンス固有の方法です。クラス全体の方法でこれを行うこともできますが、それは a には適切ではないと思いCursorます。)

メソッド全体が同期されていることに注意してください。これは、カーソルのインスタンスを 1 つだけにすることが重要な場合に重要です。それが単なる最適化であり、重要ではない場合、競合状態に耐え、同期しない可能性があります。その場合、関数によって 2 つの異なるカーソルが返される可能性があります。(二重チェックのロックイディオムを使用したくなるかもしれませんが、volatile変数を使用しない限り Java では機能せず、先に進んで同期した方が良い結果になります。)

于 2010-05-16T21:26:10.537 に答える
-1

いいえ。final変更しないことを約束することを意味します。変更したくない場合は、静的にするか、クラス メンバーにする必要があります。

于 2010-05-16T21:21:12.973 に答える