4.4 什么是Java的双括号初始化?| Java Debug 笔记

本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看<活动链接>

提问:什么是Java的双括号初始化?

如题,双括号初始化有什么坏处

回答1:
双括号初始化将创建一个从指定类(外部括号)派生的匿名类,并在该类(内部括号)内提供一个初始化程序块。举个例子

new ArrayList<Integer>() {{
   add(1);
   add(2);
}};
复制代码

请注意,使用双括号初始化的作用是创建匿名内部类。值得一提的是,创建的类具有隐式的this指针只想周围其他外部类。虽然通常情况下这不会出现问题,但在某些情况下(例如序列化或垃圾收集时)可能会引起程序运行的麻烦。

回答2:

除了语法非常不寻常且不是我们真正惯用的(当然,有的时候确实真香)之外,您还在应用程序中不必要地创建了两个重要问题

1, 您在程序运行过程中会创建过多的匿名类。

每次您使用双花括号初始化时,都会创建一个新类。例如这个例子:



Map source = new HashMap(){{
    put("firstName", "John");
    put("lastName", "Smith");
    put("organizations", new HashMap(){{
        put("0", new HashMap(){{
            put("id", "1234");
        }});
        put("abc", new HashMap(){{
            put("id", "5678");
        }});
    }});
}};
复制代码

这会让你产生以下类

Test$1$1$1.class
Test$1$1$2.class
Test$1$1.class
Test$1.class
Test.class
复制代码

2, 您可能会造成内存泄漏!

如果您采用上述代码并从一个方法返回该映射,则该方法的调用者可能会毫无疑问地持有无法回收的资源。考虑以下示例:

public class ReallyHeavyObject {

    // Just to illustrate...
    private int[] tonsOfValues;
    private Resource[] tonsOfResources;

    // This method almost does nothing
    public Map quickHarmlessMethod() {
        Map source = new HashMap(){{
            put("firstName", "John");
            put("lastName", "Smith");
            put("organizations", new HashMap(){{
                put("0", new HashMap(){{
                    put("id", "1234");
                }});
                put("abc", new HashMap(){{
                    put("id", "5678");
                }});
            }});
        }};

        return source;
    }
    }
复制代码

现在返回的Map将包含对的封闭实例的引用ReallyHeavyObject。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享