import com.google.common.collect.ImmutableMap.Builder;
import java.util.Set;
public class ImmutableMapBuilder<K, V> extends Builder<K, V> {
private Set<K> names = Sets.newHashSet();
public Builder<K, V> put(K key, V value){
if (value != null && !names.contains(key)) {
super.put(key, value);
names.add(key);
}
return this;
}
}
这段代码是Java语言编写的,它定义了一个名为`ImmutableMapBuilder`的类,这个类继承自`com.google.common.collect.ImmutableMap.Builder`。`ImmutableMap`是Google Guava库中提供的一个不可变集合类,用于创建不可变映射(Map)。不可变映射一旦创建,其内容就不能被修改,这在多线程环境中非常有用,因为它保证了线程安全性。
以下是代码的逐行解释:
1. `import com.google.common.collect.ImmutableMap.Builder;`
这行代码导入了Guava库中的`ImmutableMap.Builder`类,这个类是用于构建`ImmutableMap`的。
2. `import java.util.Set;`
导入了Java标准库中的`Set`接口,`Set`是一个不包含重复元素的集合。
3. `public class ImmutableMapBuilder<K, V> extends Builder<K, V>`
定义了一个泛型类`ImmutableMapBuilder`,它继承自`Builder`类。`K`和`V`是类型参数,分别代表键和值的类型。
4. `private Set<K> names = Sets.newHashSet();`
在类内部定义了一个私有成员变量`names`,它是一个`Set`集合,用于存储已经添加到映射中的键。这里使用了Guava库中的`Sets.newHashSet()`方法来创建一个新的`HashSet`实例。
5. `public Builder<K, V> put(K key, V value)`
重写了`Builder`类中的`put`方法。这个方法用于将键值对添加到映射中。
6. `if (value != null && !names.contains(key)) {`
在添加键值对之前,先检查值是否为非空,并且键是否还没有被添加到映射中。
7. `super.put(key, value);`
如果检查通过,调用父类`Builder`的`put`方法将键值对添加到映射中。
8. `names.add(key);`
将键添加到`names`集合中,以标记这个键已经被添加过了。
9. `return this;`
返回当前的`Builder`实例,这样可以支持链式调用。
下面是一个使用`ImmutableMapBuilder`类的示例:
public class Main {
public static void main(String[] args) {
ImmutableMapBuilder<String, Integer> builder = new ImmutableMapBuilder<>();
builder.put("one", 1).put("two", 2).put("three", 3);
// 尝试添加重复的键
builder.put("one", 10);
// 尝试添加null值
builder.put("four", null);
// 构建ImmutableMap
ImmutableMap<String, Integer> map = builder.build();
// 打印结果
System.out.println(map);
}
}
在这个示例中,我们创建了一个`ImmutableMapBuilder`的实例,并尝试添加一些键值对。我们尝试添加了一个重复的键`"one"`和一个值为`null`的键值对`"four"`。由于`ImmutableMapBuilder`类中的逻辑,这些尝试都不会成功,最终构建的`ImmutableMap`将只包含最初的三个键值对。打印结果将显示这三个键值对。