java大括号声明list_【Java必修课】Java双大括号{}的初始化

本文探讨了一种较少为人知的对象初始化方法——双大括号初始化,并对比了其与常规初始化方式的区别,最后给出了推荐的替代方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们创建并初始化一个对象,往往有多种方法,多少人知道{}也是一种?这种方法独特,是不是一个良好的特性呢?

普通初始化

通常我们会这样创建对象并初始化,如下创建一个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", "Windows", "Mac")

.collect(Collectors.toList());

assertTrue(list.contains("Windows"));

(2)Java 9可以使用Collections的工厂方法

List list = List.of("Linux", "Wiondows", "Mac");

Set set = Set.of("Linux", "Wiondows", "Mac");

总结

这种双括号{}初始化的方法,还是不要用了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值