list初始化_「Java必修课」Java双大括号「」的初始化
我们创建并初始化一个对象,往往有多种方法,多少人知道{}也是一种?这种方法独特,是不是一个良好的特性呢?
普通初始化
通常我们会这样创建对象并初始化,如下创建一个List:
List list = new ArrayList<>();list.add("Linux");list.add("Windows");list.add("Mac");assertTrue(list.contains("Linux"));
主要分为两步:(1)创建对象;(2)初始化数据。
双大括号法
利用这种方法,我们可以把创建和初始化写在一起:
list = new ArrayList() { { add("Linux"); add("Windows"); add("Mac"); }};assertTrue(list.contains("Mac"));
好处与坏处
好处:
(1)相对普通的看起来行数更少(不考虑换行等);
(2)可读性更高;
(3)创建和初始化在同一个表达式里一起完成了。
坏处:
(1)并不是一个被广泛知道和使用的方法;
(2)每次使用它都会额外产生一个匿名类;
(3)不支持泛型推断(List list = new ArrayList<>());
(4)不支持final的类;
(5)会持有隐式的引用,这可能会导致内存泄露;
正是因为有这么多坏处,我们将这种方法视为anti-pattern。
那我们可以有哪些更好的选择来创建和初始化呢?
其它更好的选择
(1)使用Stream的工厂方法
list = Stream.of("Linux 我们创建并初始化一个对象,往往有多种方法,多少人知道{}也是一种?这种方法独特,是不是一个良好的特性呢? 普通初始化 通常我们会这样创建对象并初始化,如下创建一个List: List list = new ArrayList<>();list.add("Linux");list.add("Windows");list.add("Mac");assertTrue(list.contains("Linux")); 主要分为两步:(1)创建对象;(2)初始化数据。 双大括号法 利用这种方法,我们可以把创建和初始化写在一起: list = new ArrayList() { { add("Linux"); add("Windows"); add("Mac"); }};assertTrue(list.contains("Mac")); 好处与坏处 好处: (1)相对普通的看起来行数更少(不考虑换行等); (2)可读性更高; (3)创建和初始化在同一个表达式里一起完成了。 坏处: (1)并不是一个被广泛知道和使用的方法; (2)每次使用它都会额外产生一个匿名类; (3)不支持泛型推断(List list = new ArrayList<>()); (4)不支持final的类; (5)会持有隐式的引用,这可能会导致内存泄露; 正是因为有这么多坏处,我们将这种方法视为anti-pattern。 那我们可以有哪些更好的选择来创建和初始化呢? 其它更好的选择 (1)使用Stream的工厂方法 list = Stream.of("Linux
