2 votes

Essence de BiMap dans les collections Google

Je suis toujours assez perplexe devant le BiMap dans Google collections/Guava. Il a été affirmé que Les deux bimaps sont sauvegardés par les mêmes données; tout changement sur l'un apparaîtra dans l'autre.

J'ai parcouru le code source, et j'ai trouvé l'utilisation du délégué dans ForwardingMap. Mais dans toute sous-classe de StandardBiMap, je vois que les données sont mises à la fois dans la map avant et arrière. Alors, quelle est l'essence, et pourquoi prétend-t-il avoir économisé de l'espace en ne conservant qu'une seule copie des données? Est-ce juste que les objets réels sont un ensemble, mais que deux ensembles distincts de références à ces objets sont toujours nécessaires, un ensemble maintenu dans la map avant, et l'autre dans la map arrière? Quelle est l'essence du BiMap ici, par rapport à l'approche alternative où le client maintient simplement deux maps séparées et effectue les mises à jour en conséquence?

  private V putInBothMaps(K key, V value, boolean force) {
    boolean containedKey = containsKey(key);
    if (containedKey && Objects.equal(value, get(key))) {
      return value;
    }
    if (force) {
      inverse().remove(value);
    } else if (containsValue(value)) {
      throw new IllegalArgumentException(
          "value already present: " + value);
    }
    V oldValue = super.put(key, value);
    updateInverseMap(key, containedKey, oldValue, value);
    return oldValue;
  }

8voto

ColinD Points 48573

Où voyez-vous une affirmation selon laquelle BiMap économise de l'espace en ne conservant qu'une seule copie des données ? BiMap fournit simplement des vues directes et inverses d'un ensemble d'entrées qui restent toutes deux cohérentes lorsque ces données sont modifiées. L'économie se fait en ne devant pas gérer manuellement deux maps et en garantissant que les deux sont mises à jour dans votre propre code (et en effectuant des vérifications d'erreur pour les cas où des valeurs en double seraient ajoutées à l'une des maps, provoquant un état incohérent)... utilisez simplement un BiMap et laissez tout cela être géré pour vous.

Il ne s'agit pas d'économiser de l'espace, mais de garder votre code simple, lisible et correct.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X