Java双括弧技巧回顾
初看 cgaolei 翻译的 Java技巧之双括弧初始化 一文,走马观花,只知用法,未细看后面的解释。蔚为惊艳,心里想 Java 竟然有这么神奇的语法而一直未得知。因为在初始化集合时确实方便不少。原来做某些测试要初始化集合时会用到 commons-lang 包和 JDK 的 Arrays 工具类,现在知道可以这么用了: - Map map = new HashMap() {{
- put("Name", "Unmi");
put("QQ", "1125535"); }}; List stooges = new ArrayList() {{ add("Larry"); add("Moe"); add("Curly"); }};
看起来都是在一条语句里完成,而不需要分步骤写成: - Map map = new HashMap();
- map.put("Name","Unmi");
- map.put("QQ","1125535");
一不小心没好好理解的人可能以为它是什么特别的语法,关键是大括号连一块了,原作者也是在故作姿态,美其名曰:双括弧语法(double-brace syntax)。真是乱花渐欲迷人眼,其实就是匿名类加初始块。该文有解释:第一层括弧 实际是定义了一个内部匿名类 (Anonymous Inner Class),第二层括弧 实际上是一个实例初始化块 (instance initializer block),这个块在内部匿名类构造时被执行。
那怎么去更好理解它呢?如果我们写成如下的方式应该会更好理解吧,提个技巧,在 Eclipse 中对第一段代码按下 Ctrl + Shift + F 就如下了: - Map map = new HashMap() {
- {
- put("Name", "Unmi");
- put("QQ", "1125535");
- }
- };
其实就是匿名类啊,会创建出一个 HashMap 的子类来,匿名类中一个 {} 括起来的初始化块,里面自然可放置初始化代码。{} 块中的代码编译后会放到 <init>(),也就是构造方法中去,所以可用来初始化实例。如果是写在 TestDoubleBrace 类中,编译后你会看到会生成 TestDoubleBrace$1.class 文件,反编译该文件内容是: - final class com.unmi.TestDoubleBrace$1 extends java.util.HashMap{
- com.unmi.TestDoubleBrace$1();
- Code:
- 0: aload_0
- 1: invokespecial #8;
- 4: aload_0
- 5: ldc #10;
- 7: ldc #12;
- 9: invokevirtual #14;
- 12: pop
- 13: aload_0
- 14: ldc #18;
- 16: ldc #20;
- 18: invokevirtual #
|