南瓜慢说官方网站

  • 首页
  • 所有文章
  • 容器技术
  • SpringBoot-Cloud
  • 程序人生
  • 其它
  • 整理
  • 关于

  • 搜索
中间件 config Go Private Kubernetes pkslow Test HTTPS Redis Docker Mac 计划 Stream MongoDB Spring DevOps JVM String Map Set List 性能 Email Springboot 集合类 ArrayList Java
技术之前,先读诗书:

Java双大括号{}的初始化

发表于 2019-09-27 | 分类于 Java基础 | 0 | 阅读次数 166

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

1 普通初始化

通常我们会这样创建对象并初始化,如下创建一个List:

List<String> list = new ArrayList<>();
list.add("Linux");list.add("Windows");
list.add("Mac");
assertTrue(list.contains("Linux"));

主要分为两步:

(1)创建对象;

(2)初始化数据。

2 双大括号法

利用这种方法,我们可以把创建和初始化写在一起:

list = new ArrayList<String>() {
  {
    add("Linux");
    add("Windows");
    add("Mac");
  }
};
assertTrue(list.contains("Mac"));

3 好处与坏处

好处:

(1)相对普通的看起来行数更少(不考虑换行等);

(2)可读性更高;

(3)创建和初始化在同一个表达式里一起完成了。

坏处:

(1)并不是一个被广泛知道和使用的方法;

(2)每次使用它都会额外产生一个匿名类;

(3)不支持泛型推断(List<String> list = new ArrayList<>());

(4)不支持final的类;

(5)会持有隐式的引用,这可能会导致内存泄露;

正是因为有这么多坏处,我们将这种方法视为anti-pattern。

那我们可以有哪些更好的选择来创建和初始化呢?

4 其它更好的选择

(1)使用Stream的工厂方法

list = Stream.of("Linux", "Windows", "Mac")
  .collect(Collectors.toList());
assertTrue(list.contains("Windows"));

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

List<String> list = List.of("Linux", "Wiondows", "Mac");
Set<String> set = Set.of("Linux", "Wiondows", "Mac");

5 总结

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


欢迎关注微信公众号<南瓜慢说>,将持续为你更新...

file

推荐阅读:
如何制定切实可行的计划并好好执行
容器技术(Docker-Kubernetes)
SpringBoot-Cloud相关
Https专题

  • 本文作者: 南瓜慢说
  • 本文链接: https://www.pkslow.com/archives/java-double-brace-initialization
  • 版权声明: 本博客所有文章除特别声明外,不可转载!
# 中间件 # config # Go # Private # Kubernetes # pkslow # Test # HTTPS # Redis # Docker # Mac # 计划 # Stream # MongoDB # Spring # DevOps # JVM # String # Map # Set # List # 性能 # Email # Springboot # 集合类 # ArrayList # Java
中间件 config Go Private Kubernetes pkslow Test HTTPS Redis Docker Mac 计划 Stream MongoDB Spring DevOps JVM String Map Set List 性能 Email Springboot 集合类 ArrayList Java
Java 8之例说Stream的合并
Java 8中map()与flatMap()在Optional和Stream中的区别
  • 文章目录
  • 站点概览
南瓜慢说

南瓜慢说

多年Java开发,主要专注后端技术:Java/Spring/Springboot/微服务/大数据等。

多读书,多分享;多写作,多整理。

152 日志
7 分类
27 标签
RSS
0%
© 2020 — 2021 南瓜慢说 本站已挣扎运行:   粤ICP备20036375号