- 浏览: 1248639 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (729)
- Java_about (144)
- Spring_Hibernate_Struts_OpenSource (27)
- linux_unix (62)
- life_sth (21)
- js_css_html_xml_nodejs (69)
- design_pattens (1)
- Perl (8)
- php_ecshop (4)
- DB_Mysql_Oracle_Informix_SqlServer (43)
- JSTL (8)
- Testing_自动化测试 (42)
- DB_ID_UUID (4)
- SEM_SEO (1)
- english_study_improvement (4)
- SVN_Git (9)
- WebService_SOA_CloudComputing (3)
- E-Commerce (1)
- Lucene_Solr (7)
- others (2)
- Regex (2)
- tomcat_jetty (8)
- zeroc-ice (1)
- java_excel (5)
- ant_maven_gradle (5)
- Unity_VR_AR_C# (2)
- jmeter (1)
- XPath_dom4j (1)
- Ruby_and_Rails (68)
- write_a_rails (17)
- manage_and_team (1)
- getting_real (1)
- ubuntu (20)
- git_and_git_flow (7)
- TODO (1)
- PM_design (2)
- Python_and_Django (8)
- NoSql_mongo_redis (24)
- C/C++ (3)
- vi_vim_gvim (0)
- c#_.Net_windows编程_dll (10)
- Php_and_Yii (9)
- Android_IOS (31)
- Mysql (5)
- sa_运维_network_硬件 (37)
- lua (2)
- c_cpp_VisualStudio (21)
- 硬件-RM-Arduino (6)
最新评论
-
shenkun58:
...
NoClassDefFoundError: Could not initialize springframework.BeanCreationException -
liaojia1:
正解,感谢
NoClassDefFoundError: Could not initialize springframework.BeanCreationException -
flingfox63:
谢谢分享,电脑上有IPV6,导致了Guard启动不了……
ruby错误解决: Address family not supported by protocol - connect(2) -
c39274936:
s = "hello_world_ruby" ...
驼峰格式和下划线格式转换_translation between camel and snake format -
yfj300:
学习了学习了学习了学习了
硬盘基本知识(磁道、扇区、柱面、磁头数、簇、MBR、DBR)
null
--------------------------摘----------------------------
初看 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.
}};
看起来都是在一条语句里完成,而不需要分步骤写成:
一
不小心没好好理解的人可能以为它是什么特别的语法,关键是大括号连一块了,原作者也是在故作姿态,美其名曰:双括弧语法(double-brace
syntax)。真是乱花渐欲迷人眼,其实就是匿名类加初始块。该文有解释:第一层括弧 实际是定义了一个内部匿名类 (Anonymous
Inner Class),第二层括弧 实际上是一个实例初始化块 (instance initializer
block),这个块在内部匿名类构造时被执行。
那怎么去更好理解它呢?如果我们写成如下的方式应该会更好理解吧,提个技巧,在 Eclipse 中对第一段代码按下 Ctrl + Shift + F 就如下了:
其
实就是匿名类啊,会创建出一个 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
发表评论
-
打包Java程序为.exe文件
2023-09-27 16:25 144= = = 打包Java程序为.exe文件 fro ... -
Java怎么生成exe可执行文件【图文讲解】
2023-09-27 16:21 179= 开发的工具,让客户体验一下再说。此时又不想发源码,怕 ... -
Java8 List集合Stream流方法操作详解
2023-09-27 16:02 145= = = from: https://zhuanl ... -
Java8 List集合Stream流方法操作详解
2023-09-27 15:59 230= = = from: https://zhuan ... -
Java8 List集合Stream流方法操作详解
2023-09-27 15:56 99= = = from: https://zhuanl ... -
【原创】Cannot create property=xxx for JavaBean=【lombok 和 yaml包 混合报错】
2023-02-04 23:31 571= = = 问题: 同时使用lombok 和 ... -
【摘】Java文档注释用法+JavaDoc的使用详解
2022-09-12 16:32 217= = 节约重复注释 使用@inheritDo ... -
【朝花夕拾】java内部类,原理,使用
2022-08-09 22:52 165= 碰到类似问题,多读《thinking in java ... -
【拾遗】java数组copy拷贝复制的工具类方法
2022-06-11 21:20 495= 对工具类来说,copyOfRange 最好用。 这 ... -
利用Httpclient下载图片,java不用httpClient下载图片
2022-05-30 22:25 362= = = from:https://blog.csd ... -
为什么要使用lombok?
2022-04-04 20:46 272= = = 参考:https://blog.csd ... -
朝花夕拾:java-向上转型中变量覆盖要小心使用_继承过程中Java子类父类属性的覆盖问题
2022-01-13 17:31 334==== 现在的代码结构设计的复杂起来了,为了后来人编写 ... -
【Mysql数据库】Cause: java.sql.SQLException: The table 'xxx' is full
2022-01-04 17:03 1372= 本地开发测试,怎 ... -
JAVA工具类学习-java 两个list 交集 并集 差集 去重复并集
2021-09-10 16:17 794= = = List<String> ... -
java汉字判断,中文符号判断,中文标点符号判断
2021-09-02 19:07 1014=== = = 一、判断中文汉字 st ... -
velocity的模板笔记总结文档-方便查阅
2020-04-28 14:41 304= 最好把这几个官网文档看了: 官网官方文档refer ... -
mjson:像python和ruby一样好用的java类库操作json_js
2020-04-17 20:54 437= = = JSON Library for Jav ... -
关于idea2019.2-2019.3版本中文控制台乱码问题,tomcat7-tomcat8乱码
2020-04-04 23:20 390= 1 idea2019.2-2019.3版本中文控制台乱 ... -
Tomcat7-Tomcat8的manager配置以及在idea下的异常表现
2020-04-04 23:13 438Tomcat7-Tomcat8的manager配置以及在id ... -
selenium不打开浏览器和打开浏览器-很方便(java)
2020-03-23 21:38 1215= 自动化测试的时候,每次都打开浏览器,会影响全部测试运行 ...
相关推荐
Java的在还没有发现新写法之前时,我一直是这么初始化List跟Map: //初始化List List list = new ArrayList(); list.add("string1"); list.add("string2"); //some other list.add() code…… list.add(...
主要介绍了Java中List与Map初始化的一些写法有需要的朋友可以参考一下
主要介绍了java中hashmap容量的初始化实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
主要介绍了java在hashmap初始化时赋初值过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
今天小编就为大家分享一篇关于Java源码解析ConcurrentHashMap的初始化,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
主要介绍了Java编程中HashMap的初始化以及遍历的方法,是Java入门学习中的基础知识,需要的朋友可以参考下
主要给大家介绍了关于Java中如何实现不可变Map的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作工具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
先初始化一个map public class TestMap { public static Map<Integer> map = new HashMap(); } keySet values 如果只需要map的key或者value,用map的keySet或values方法无疑是方便的 // KeySet ...
类的初始化 成员初始化 构造器初始化初始化顺序 数组初始化 对象的销毁 对象作用域 this 和 super 访问控制权限继承 多态组合代理 向上转型static final 接口和抽象类接口 抽象类异常 认 识 Exception 什么是 ...
* 初始化游戏的一局 */ public void init(){ //创建Map对象 //生成地图 map.createMap(); //设置玩家1起始位置 playerPos1 = 0; //设置玩家2起始位置 playerPos2 = 0; //记录玩家1...
数据类型、变量与运算符:理解Java中的基本数据类型、变量声明与初始化,以及常用的运算符和表达式。 控制流语句:熟悉if-else、switch、for、while等控制流语句的用法。 面向对象编程:深入理解Java中的类、对象、...
141、使用useBean标志初始化BEAN时如何接受初始化参数 36 142、使用JSP如何获得客户浏览器的信息? 36 143、能象调用子程序一样调用JSP吗? 36 144、当我重编译我的JSP使用的一个类后,为什么JVM继续使用我的老CLASS...
使用策略模式构建支付模块,根据spring初始化容器时候,将实现类接口信息放入map中,再根据具体的key值取得具体的实现类
2024年Java高工面试题 JVM虚拟机:堆、方法区(元空间)、栈(线程)、本地方法栈、程序计数器 ...推断构造方法、实例化、属性填充、初始化前、初始化、初始化后等其中AOP就是发生在初始化后这一步
源码深信网络java AI_Map 人工智能发展地图。 人工智能是一个非常广泛且不断发展的计算机科学领域。 随着时间的推移,这个 repo 将被更新和扩展。 随时欢迎您的贡献。 “人工智能是新的电力”吴恩达。 经典人工智能 ...
2.5.4 初始化托管Bean的属性 85 2.5.5 通过FacesContext访问应用环境 89 2.6 导航模型 91 2.6.1 静态导航 93 2.6.2 动态导航 93 2.7 使用UI标签创建视图页面 94 2.7.1 UI标签概述 94 2.7.2 UI标签的通用属性 97 ...
1.2 Java的竞争对手及各自优势 4 1.2.1 C#简介和优势 4 1.2.2 Ruby简介和优势 4 1.2.3 Python的简介和优势 5 1.3 Java程序运行机制 5 1.3.1 高级语言的运行机制 6 1.3.2 Java程序的运行机制和JVM 6 1.4 开发...
2.2.2 示例:延迟初始化中的竞态条件 2.2.3 复合操作 2.3 加锁机制 2.3.1 内置锁 2.3.2 重入 2.4 用锁来保护状态 2.5 活跃性与性能 第3章 对象的共享 3.1 可见性 3.1.1 失效数据 3.1.2 非原子的64位操作 ...
静态初始化块(经常用来初始化类,加载类信息时执行!) 67 package 68 JDK中的主要包 68 import 68 eclipse的使用 69 继承(extend, inheritance) 70 为什么需要继承?继承的作用? 70 继承介绍 70 如何实现继承? ...