首页>java频道>java教程>正文
Java双括弧技巧:不规范的语法

www.zige365.com 2010-6-7 11:56:15 点击:发送给好友 和学友门交流一下 收藏到我的会员中心

Java双括弧技巧回顾

初看 cgaolei 翻译的 Java技巧之双括弧初始化 一文,走马观花,只知用法,未细看后面的解释。蔚为惊艳,心里想 Java 竟然有这么神奇的语法而一直未得知。因为在初始化集合时确实方便不少。原来做某些测试要初始化集合时会用到 commons-lang 包和 JDK 的 Arrays 工具类,现在知道可以这么用了:

  1. Map map = new HashMap() {{  
  2.   put("Name""Unmi");  
  3.   put("QQ""1125535");  
  4. }};  
  5.  
  6. List stooges = new ArrayList() {{  
  7.   add("Larry");  
  8.   add("Moe");  
  9.   add("Curly");  
  10. }};  
  11.  

看起来都是在一条语句里完成,而不需要分步骤写成:

  1. Map map = new HashMap();  
  2. map.put("Name","Unmi");  
  3. map.put("QQ","1125535"); 

一不小心没好好理解的人可能以为它是什么特别的语法,关键是大括号连一块了,原作者也是在故作姿态,美其名曰:双括弧语法(double-brace syntax)。真是乱花渐欲迷人眼,其实就是匿名类加初始块。该文有解释:第一层括弧 实际是定义了一个内部匿名类 (Anonymous Inner Class),第二层括弧 实际上是一个实例初始化块 (instance initializer block),这个块在内部匿名类构造时被执行。

那怎么去更好理解它呢?如果我们写成如下的方式应该会更好理解吧,提个技巧,在 Eclipse 中对第一段代码按下 Ctrl + Shift + F 就如下了:

  1. Map map = new HashMap() {  
  2.  {  
  3.   put("Name""Unmi");  
  4.   put("QQ""1125535");  
  5.  }  
  6. }; 

其实就是匿名类啊,会创建出一个 HashMap 的子类来,匿名类中一个 {} 括起来的初始化块,里面自然可放置初始化代码。{} 块中的代码编译后会放到 <init>(),也就是构造方法中去,所以可用来初始化实例。如果是写在 TestDoubleBrace 类中,编译后你会看到会生成 TestDoubleBrace$1.class 文件,反编译该文件内容是:

  1. final class com.unmi.TestDoubleBrace$1 extends java.util.HashMap{ //创建了一个 HashMap 的子类 TestDoubleBracke$1  
  2. com.unmi.TestDoubleBrace$1();  
  3.   Code:  
  4.    0:   aload_0  
  5.    1:   invokespecial   #8//Method java/util/HashMap."<init>":()V   //{} 中的代码放到了构造方法中去了  
  6.    4:   aload_0  
  7.    5:   ldc     #10//String Name  
  8.    7:   ldc     #12//String Unmi  
  9.    9:   invokevirtual   #14//Method put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;  
  10.    12:  pop  
  11.    13:  aload_0  
  12.    14:  ldc     #18//String QQ  
  13.    16:  ldc     #20//String 1125535  
  14.    18:  invokevirtual   #

    本新闻共2页,当前在第1页  1  2  

我要投稿 新闻来源: 编辑: 作者:
相关新闻
关于Java语法技巧之双括弧初始化
有关Java的synchronized关键字:同步机制总结
双检测锁定(DCL)和Singleton模式的问题
关于Smooks 1.2框架:处理XML与非XML的Java框架
浅谈在Java中使用Gmail发送邮件