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 的匿名子类。因此才回头认真的重新审视了一番这个所谓的双括符初始化语法。
参考:
http://www.iteye.com/topic/412868
http://www.blogjava.net/Unmi/archive/2009/08/12/290845.html
http://www.iteye.com/topic/418542
发表评论
-
初学者学习linux
2012-12-19 17:53 672http://wuhaoshu.blog.51cto.com/ ... -
jquery选择器总结
2012-11-21 11:43 9471.<script type="text/ja ... -
外网的压力测试
2012-11-07 10:32 1152外网的压力测试,可以使用apache的ab或curl-load ... -
试着学学object-c
2012-11-05 15:50 8021.http://www.neatstudio.com/sho ... -
栈的基本原理,实现自己的堆栈
2012-10-23 10:16 1249栈是重要的数据结构,从数据结构角度看,栈也是线性表,其特殊性在 ... -
学习java单例模式
2012-10-22 16:16 706http://calmness.iteye.com/blog/ ... -
JsonUtil错误总结
2012-09-26 10:10 1064java.lang.Integer cannot be cas ... -
struts2总结错误
2012-09-25 10:40 7271.数据类型的不对应,一般是,后台要求int而前端的zoneI ... -
Jquery总结
2012-09-18 14:08 0$.toJSON(); $.parseJson(unescap ... -
mysql学习总结
2012-08-23 17:19 8411.<![CDATA[ select ifnull(su ... -
学习强者的成长之路
2012-08-09 10:25 844http://xwnet.blog.51cto.com/233 ... -
MD5正规的写法
2012-07-20 10:26 880public static String getMD5(byt ... -
引用:异常处理!
2012-07-20 09:37 707... -
关于网站的设计
2012-07-19 10:08 749网站的性能优化:http://www.cnblogs.com/ ... -
eval用法
2012-07-12 10:12 879在函数中改变全局变量 var X2={} X2.Eval= ... -
错误总结
2012-07-11 10:38 6421.missing ) in parenthetical错误可 ... -
登录验证struts2
2012-07-09 09:40 739类需要继承ActionSupport,重写execute方法, ... -
学习js的好地方
2012-06-28 13:16 799http://www.zhuoda.org/lunzi/dir ... -
登陆页面
2012-06-26 18:42 986http://themeforest.net/item/dre ... -
学习Session 基类
2012-06-26 16:48 857package com.ruangao.framework.w ...
相关推荐
Java双括弧初始化是一种在Java编程中用于简化集合框架(如List、Set、Map等)对象的创建和初始化的技巧。这种技术通过创建一个匿名内部类,并在其内部使用实例初始化块来填充集合对象,从而提高了代码的简洁性和...
本文将深入探讨如何在Java中利用匿名内部类进行双括弧初始化的方法。 首先,让我们理解什么是匿名内部类。匿名内部类是不具有名字的类,通常用于实现接口或继承一个类,并且仅在一个地方使用。它们的定义紧跟在它们...
Java 在 HashMap 初始化时赋初值过程解析 ...本文介绍了 Java 中的 HashMap 初始化时赋初值过程解析,包括使用双括号进行初始化的语法和可能导致的串行化失败的问题,以及解决办法。希望对大家的学习有所帮助。
【DB查询分析器访问EXCEL时,要在表名前后加上中括弧或双引号】 在数据库管理和数据分析领域,DB查询分析器是一款非常实用的工具,尤其对于处理多种数据库平台和非结构化数据如Excel文件时。《DB 查询分析器》是由...
2. 初始化视图:在构造函数中,你可以设置默认属性,比如颜色、大小等,并重写必要的方法,如`onDraw()`,这是自定义绘图的关键。 ```java @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas...
- **双括弧初始化**:这是一种快速创建集合对象并初始化元素的技巧,虽然简洁但可能引起内存浪费。 - **设计模式探讨**:讨论了在不同场景下,如何选择和设计更加合理的软件架构,集思广益寻求最佳实践。 5. **...
1. 初始化一个空栈。 2. 遍历输入字符串,对于每个字符: - 如果是开括号,将其压入栈中。 - 如果是闭括号,检查栈顶元素是否为它的匹配开括号: - 如果是,将栈顶元素弹出。 - 如果不是,或者栈为空,返回错误...
自定义视图通常需要重写构造函数,以设置必要的初始化参数。例如: ```java public CustomBracketView(Context context) { super(context); } public CustomBracketView(Context context, AttributeSet ...
模块化的设计可以使代码更易于维护和扩展,如使用策略模式来封装不同类型的运算,使用工厂模式来创建不同类型的数字对象。此外,单元测试也是保证代码质量的重要环节,对于每个运算功能,都应该编写对应的测试用例,...
例如,可以定义一个数组作为栈空间,初始化一个栈顶指针,用于跟踪当前栈顶位置。当需要压栈时,栈顶指针加一,然后将元素存入对应位置;当需要弹栈时,栈顶指针减一,取出对应位置的元素。这样,我们就可以在程序中...
1. 初始化一个空栈。 2. 遍历输入的括号字符串,遇到每个字符: - 如果是左括号('('、'['或'{'),将其压入栈中。 - 如果是右括号(')'、']'或'}'),检查栈顶元素是否为对应的左括号。如果是,弹出栈顶元素;...
大括弧 `{}` で囲まれています。 - **メソッドの例**: ```java public int addNumbers(int a, int b) { return a + b; } ``` #### 4. 継承(Inheritance) - **継承の定義**: 継承は親クラスの特性(メンバ変...
办公自动化Axure RP8.0 标准课程括弧和半圆形.mp4
C++括弧匹配检验题解样例
find_java.bat 无法正常运行,可能是两个原因造成的:1、路径中包含括弧等特殊字符;2、Windows API 函数 GetShortPathName 未能正常工作
在Java中,编写程序时应遵循一定的编码规范,例如类名使用public修饰,每条语句占一行,花括弧放置得当,代码保持良好的缩进。此外,变量是程序中存储数据的基本元素。以入住酒店为例,房间号可以视为变量,代表特定...
【Android应用源码可以运行括弧的科学计算器】是一个针对Android平台开发的源代码项目,旨在实现一个功能完善的科学计算器,特别强调了支持括号运算的功能。在Android开发中,创建这样的应用程序通常涉及到以下几个...
1. 初始化一个空栈。 2. 遍历输入的括号序列。 3. 对于每个遍历到的括号: - 如果是打开括号,将其压入栈中。 - 如果是关闭括号,检查栈是否为空以及栈顶的括号是否与当前的关闭括号匹配。如果匹配,弹出栈顶元素...
该程序是针对数据结构实验在mfc下实现括弧匹配
1. 初始化一个空栈。 2. 遍历输入的括号字符串,对于每个字符: - 如果是左括号,将其压入栈中。 - 如果是右括号,检查栈是否为空,以及栈顶元素是否为对应左括号。如果是,弹出栈顶元素;否则,说明括号不匹配。 ...