2010-05-16 18 views
1

J'ai ce code pour obtenir le curseur une fois pour cette instance, et le journal montre qu'il est appelé plusieurs fois bien que je l'ai marqué comme final. Qu'est-ce qui me manque?Pourquoi ce cache ne fonctionne pas en utilisant le modificateur final

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

méthode getAllContactsCached doit récupérer la liste une fois, et la 2ème fois, il devrait réutiliser l'objet final pour le retour

Répondre

4

Java n'a pas de variables locales statiques dans les fonctions (comme C a); final signifie quelque chose de complètement différent de ce que vous faites.

La seule façon que vous pouvez obtenir ce genre de statique est d'utiliser une instance ou un membre de la classe, par exemple:

class Foo { 
    private Cursor theCursor; 

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

(C'est la manière spécifique, par exemple, vous pouvez aussi le faire dans une grande classe manière, mais je devine que ce n'est pas approprié pour un Cursor.)

Notez que la méthode entière est synchronisée. Ceci est important si c'est crucial que vous avez seulement une seule instance du curseur. Si c'est simplement une optimisation, et non cruciale, vous pourriez vivre avec la condition de concurrence et ne pas synchroniser, auquel cas vous pourriez vous retrouver avec deux curseurs différents retournés par la fonction. (Vous pourriez être tenté d'utiliser le double-checked locking idiom, mais il ne fonctionne pas avec Java, sauf si vous utilisez une variable volatile, et il ends up just being better à aller de l'avant et synchronisez.)

-1

Non. final signifie que vous promettez de ne pas le changer. Si vous voulez que cela ne change pas, vous devez le rendre statique ou un membre de classe.

+0

-1 - « signifie finale vous promets de ne pas changer " - Faux. Cela signifie que vous ne pouvez pas le changer. Le problème ici est que l'OP ne comprend pas la portée/durée de vie de 'c'. –