Google collections/GuavaのBiMapにはまだかなり戸惑っています。2 つの bimap は同じデータに裏打ちされていると主張されました。一方への変更は、他方に表示されます。
ソースコードをざっと見てみると、デリゲートの使い方がForwardingMap
. しかし、 の実際のサブクラスではStandardBiMap
、データがフォワード マップとリバース マップの両方に配置されていることがわかります。では、本質は何であり、データのコピーを 1 つだけ保持することでスペースを節約したと主張するのはなぜでしょうか? 実際のオブジェクトは 1 つのセットですが、これらのオブジェクトへの参照の 2 つの異なるセットがまだ必要であり、1 つのセットはフォワード マップで維持され、もう 1 つはリバース マップで維持されますか? ここでの BiMap の本質と、クライアントがあまりにも別個のマップを維持し、それに応じて更新を行う代替アプローチとは何ですか?
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;
}