美文网首页技术干货Java
【Java必修课】Java双大括号{}的初始化

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

作者: 南瓜慢说 | 来源:发表于2019-10-09 23:24 被阅读0次

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

    普通初始化

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

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

    主要分为两步:

    • (1)创建对象;
    • (2)初始化数据。

    双大括号法

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

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

    好处与坏处

    好处:

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

    • (2)可读性更高;

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

    坏处:

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

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

    • (3)不支持泛型推断(List<String> 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<String> list = List.of("Linux", "Wiondows", "Mac");
    Set<String> set = Set.of("Linux", "Wiondows", "Mac");
    

    总结

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

    相关文章

      网友评论

        本文标题:【Java必修课】Java双大括号{}的初始化

        本文链接:https://www.haomeiwen.com/subject/oxbnpctx.html