也说Java的双括符初始化:其实就是令人费解的不尺度代码[Java编程]
本文“也说Java的双括符初始化:其实就是令人费解的不尺度代码[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
初看 cgaolei 翻译的 Java本领之双括弧初始化 一文,走马观花,只知用法,未细看背面的注释.蔚为冷艳,心里想 Java 竟然有这么奇异的语法而一向未得知.因为在初始化集合时确切便利不少.本来做某些测试要初始化集合时会用到 commons-lang 包和 JDK 的 Arrays 工具类,目前知道可以这么用了:
01.Map map = new HashMap() {{
02. put("Name", "Unmi");
03. put("QQ", "1125535");
04.}};
05.
06.List stooges = new ArrayList() {{
07. add("Larry");
08. add("Moe");
09. add("Curly");
10.}};
看起来都是在一条语句里完成,而不需求分步骤写成:
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 文件,反编译该文件内容是:
01.final class com.unmi.TestDoubleBrace$1 extends java.util.HashMap{ //成立了一个 HashMap 的子类 TestDoubleBracke$1
02.com.unmi.TestDoubleBrace$1();
03. Code:
04. 0: aload_0
05. 1: invokespecial #8; //Method java/util/HashMap."<init>":()V //{} 中的代码放到了构造办法中去了
06. 4: aload_0
07. 5: ldc #10; //String Name
08. 7: ldc #12; //String Unmi
09. 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 #14; //Method put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
15. 21: pop
16. 22: return
17.
18.}
所以说白了,什么双括弧语法啊,就是代码写得不标准,才使得那么的令人费解.假如还不能理解,再列两个惯用代码来:
01.JFrame frame = new JFrame();
02.frame.addMouseListener(new MouseAdapter() {
03. public void mouseClicked(MouseEvent e) {
04. // do womething here.
05. }
06.});
07.
08.Thread thread = new Thread() {{ // 也学着样把大括号也连一块写了
09. this.setName("功课处理线程");
10. }// 假如不重新定义 run() 办法,那么背面那个大括号也能与这个并一块
11.
12. public void run() {
13. // do something here.
14. }
15.};
16.thread.start();
应当没问题了吧,上面是事件监听器和多线程常用的写法,假如他不把大括号连在一同,而是标准的写代码,相信您一开始也不会对所谓的 Double Brace Syntax 有太多的困惑.要说这种初始化办法应用到调集合还挺便利的,只是无端的多了些匿名类.
刚开始我看到这种双括符写法也是把它奉若圣经,对它只一知半解,昨天在用 XStream 把一个对象生成 XML 文件时,此中有一个 List 属性,我就借用了这种双括符法来初始化元素,后果生成的 XML 文件走了样,缘由是 XStream 的 Converter 能处理 ArrayList,但无法很好的处理生成的 ArrayList 的匿名子类.因此才回头认真的重新审视了一番这个所谓的双括符初始化语法.
以上是“也说Java的双括符初始化:其实就是令人费解的不尺度代码[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |