java9新特性-JEP 269:集合类便利的工厂方法

来源:互联网 发布:烟袋斜街10号 网络剧9 编辑:程序博客网 时间:2024/05/29 13:14

翻译(部分翻译)自:http://openjdk.java.net/jeps/269

Summary
当需要只包含几个元素的Collection或Map的实例时,可以更加方便地创建,以解决java语言中没有集合类或Map的字面量问题。

Goals
在Collection或Map接口中提供静态工厂方法,以便创建简洁的、不可修改的实例对象。

Non-Goals
并不是以创建高性能和包含任意数量的元素的实例对象为目标,而是主要用在小的Collection和Map上。
并不是为了提供不可修改的Collection和Map类型,尽管这些工厂方法所产生的实例是不可修改的。

Motivation
java一直因为它的代码冗长为人所诟病。例如,创建一个小的、不可修改的Collection或Map,以Set为例,要(1)实例化,(2)保存在一个局部变量,(3)几次调用add方法,(4)然后包装它。

Set<String> set = new HashSet<>(); //(1) (2)set.add("a"); // (3)set.add("b"); // (3)set.add("c"); // (3)set = Collections.unmodifiableSet(set); // (4)

这太啰嗦了。

另一种方式是:

Set<String> set = Collections.unmodifiableSet(new HashSet<>(Arrays.asList("a", "b", "c")));

这依然很啰嗦,看起来一点也不够清晰,在创建set之前还要创建一个list。

另外一种方式被称为“double brace”:

Set<String> set = Collections.unmodifiableSet(new HashSet<>{    {        add("a"); add("b"); add("c");    }});

这种方式是使用的匿名内部类和实例代码块,这种方式会额外消耗一个类。匿名内部类持有外部引用会引起内存泄露问题,这种方法最好避免。(为什么会引起内存泄露?)

另一种方法是使用java8中的Stream API,

Set<String> set = Collections.unmodifiableSet(Stream.of("a", "b", "c").collect(toSet()));

这多多少少还是很啰嗦的。它包含了一些不必要的操作。

在过去,有很多的关于修改java语言以支持Collection和Map字面量的提议。

通过以最小的代价和风险来修改java以支持集合类字面量操作,最终java9中新的方式为:

Set<String> set = Set.of("a", "b", "c");

Description
在List、Set和Map接口中提供静态工厂方法以创建小的且不可修该的实例对象。

List.of(a, b, c);Map.of();Map.of(k1, v1);Map.of(k1, v1, k2, v2);Map.of(k1, v1, k2, v2, k3, v3);Map.ofEntries(Map.Entry<K, V>...)Map.ofEntries(    entry(k1, v1),    entry(k2, v2),    entry(k3, v3),    // ...    entry(kn, vn));

还没有写完!!!!

原创粉丝点击