java - 在 Java 中使用就地集合初始化器的缺点是什么

标签 java collections dictionary initialization set

考虑这段代码:

Set<String> mySet = new HashSet<String>(){{add("foo");add("boo");}};

或者对于 HashMap:

Map<String,String> myMap = new HashMap<String,String>(){{put("foo","bar");put("boo","jar");}};

优点很简单:代码行数少,简洁。但是有什么缺点呢?

UPD:问题不仅涉及集合,还涉及所有类型的集合,添加了 Map 来说明这一点。

最佳答案

当您这样做时,您正在创建 HashSet 的匿名子类,这意味着您不必要地用不执行任何新操作的类污染了您的代码库。

这个怎么样?

Set<String> set = new HashSet<String>(Arrays.asList("foo", "bar"));

或者,使用 GuavaSets类(class)。它有工厂方法来初始化不同种类的集合:

Set<String> set = Sets.newHashSet("foo", "bar");

使用 map 会比较棘手,但您可以使用 ImmutableMap :

Map<String,String> myMap = 
    ImmutableMap.of("foo","bar","boo","jar");

或(可变版本)

Map<String,String> myMutableMap =
        Maps.newHashMap(ImmutableMap.of("foo","bar","boo","jar"));

没有外部库,您仍然可以使用单个条目初始化 Map:

Map<String,String> myMap = new HashMap<String, String>(
    Collections.singleTonMap("foo","bar")
);

但如果你问我,那是一只丑陋的野兽。


UPD: The question is not only about sets, but about all types of collections, added Map to illustrate this.

Guava 有几个这样的工厂类:

Sets , Maps , Lists , Multimaps , Multisets , Ranges

关于java - 在 Java 中使用就地集合初始化器的缺点是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6665049/

相关文章:

java - Java 桌面应用程序基于 XML 或 HTML 的 UI

java - 如何从 EC 公钥字节中获取 PublicKey 对象?

.net - 可以在 "addition order"中枚举哪些 dotnet 集合类的项目并通过键检索?

c++ - 就地更新 map

Python 按键值排序字典

java - 我什么时候得到 javax.net.ssl.SSLHandshakeException : sun. security.validator.ValidatorException: No trusted certificate found

java - 如何在 Java 中使用 cURL?

java - 为什么 java 中的 collection.toArray() 不支持自动装箱

java - 为什么要使集合不可修改?

python - 这本字典如何获取数据?