2017-04-14 2 views
0

Je veux obtenir & supprimer un élément de CacheGoyave: Cache.asMap(). Remove() est-il meilleur?

final Cache<String, PendingRequest> pendingRequest = CacheBuilder.newBuilder().build(); 

// get first 
pendingCall = pendingRequest.getIfPresent(key); 
pendingRequest.invalidate(key); // then remove. 

J'ai aussi trouvé une autre façon

pendingCall = pendingRequest.asMap().remove(key); 

Est-ce que la méthode asMap clone tous les éléments? Est-ce un appel lourd? Quelle est la meilleure façon d'envisager la performance?

Répondre

1

Il n'y a pas de différence réelle entre ces appels parce Cache#asMap() est défini comme:

Renvoie une vue des entrées stockées dans ce cache comme une carte de thread-safe. Les modifications apportées à la carte affectent directement le cache.

Calling asMap()peut être un peu moins performant (car il est possible une vue doit être créé) mais le temps est constante (et négligeable) et est un détail de mise en œuvre (voir Goyave interne LocalCache and LocalManualCache classes pour plus de détails).

Ce qui est plus important, Cache#invalidate(K) est plus idiomatiques et je recommande de l'utiliser au lieu de carte des méthodes de vue (modifier après le commentaire de @BenManes ci-dessous) si vous n'avez pas besoin valeur retournée associée à la clé, sinon utilisez vue de la carte.

+3

Bien que plus idiomatique, la vue est utile dans le cas où la valeur supprimée est nécessaire. Cette opération est atomique, alors que son alternative d'effectuer deux opérations est racée. L'interface Cache fournit une abstraction idiomatique et simple, tandis que la vue fournit une trappe d'échappement pour les besoins plus avancés. –

+0

@BenManes Vous avez raison, je n'ai pas compris que OP avait besoin d'utiliser la valeur supprimée. – Xaerxess