は私が気づいた(と感謝!)グァバのImmutableMap.Builder
は、重複キーをビルダーに追加されている場合はビルドに失敗したことをImmutableMapません。しかし、同じ動作(重複要素を追加)はImmutableSet
で成功します。この違いの理由、および同じ障害時の動作とImmutableSet
を構築する何か良い方法ははなぜのImmutableSetは、重複を許可しないが、
ありますか?
テストケース:
import static org.testng.Assert.*;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
public class ImmutableDuplicatesTest
{
@Test(expectedExceptions=IllegalArgumentException.class) // Note failure
public void mapDuplicates() {
ImmutableMap.Builder<String, String> map = ImmutableMap.builder();
map.put("a", "a");
map.put("b", "b");
map.put("a", "c");
assertEquals(map.build().size(), 2);
}
@Test // Passes normally
public void setDuplicates() {
ImmutableSet.Builder<String> set = ImmutableSet.builder();
set.add("a");
set.add("b");
set.add("a");
assertEquals(set.build().size(), 2);
}
}
のようなものです私の推測では、セットを使用すると、入力と同じことを二度だけ、それの一つのコピーを持つことができるように設計されている、ということでしょう。しかしマップで、あなたが新しい値に同じキーをマッピングする場合、それは古いものを上書きし、これは動作 – Cruncher
を意図することはできませんしかし、値は関係ありません同じであるかどうか、それは重複に高速失敗しますキー。 – dimo414