pkslow.com 南瓜慢说

  • AllArticles
  • Container
  • Spring
  • Life
  • Cloud
  • Collections
  • About
  • GitHub

  • Search
Terraform101 English Terraform Middleware config Go Private Kubernetes pkslow Test HTTPS Redis Docker Mac Plan Stream MongoDB Spring DevOps JVM String Map Set List Performance Email Springboot JavaCollections ArrayList Java

Java双大括号{}的初始化

Created on: 2019-09-27 | Category: Java | 0 | View: 582

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

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 总结

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


Code for all: GitHub

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

file

Recommendations:
Cloud Native
Terraform
Container: Docker/Kubernetes
Spring Boot / Spring Cloud
Https
如何制定切实可行的计划并好好执行

  • Author 作者: LarryDpk 南瓜慢说
  • Link 链接: https://www.pkslow.com/archives/java-double-brace-initialization
  • 版权声明: 本博客所有文章除特别声明外,不可转载!
# Terraform101 # English # Terraform # Middleware # config # Go # Private # Kubernetes # pkslow # Test # HTTPS # Redis # Docker # Mac # Plan # Stream # MongoDB # Spring # DevOps # JVM # String # Map # Set # List # Performance # Email # Springboot # JavaCollections # ArrayList # Java
Terraform101 English Terraform Middleware config Go Private Kubernetes pkslow Test HTTPS Redis Docker Mac Plan Stream MongoDB Spring DevOps JVM String Map Set List Performance Email Springboot JavaCollections ArrayList Java
使用正则统计英文文章中的高频词汇
Java 8基本类型的Stream
  • Contents
  • Site Overview
南瓜慢说

南瓜慢说

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

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

241 Posts
9 Categories
30 Tags
RSS
0%
© 2020 — 2022 南瓜慢说 pkslow The WebSite keeping alive:   粤ICP备20036375号