|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
C++编译的是本地码,优点是启动快,而且可以精确控制资源因此可以开发很高效的程序.缺点是编程麻烦,而且容易留下安全隐患.跨平台靠源代码在各个平台间分别编译(一处编写到处编译)
初看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-bracesyntax)。真是乱用渐欲诱人眼,实在就是匿名类加初始块。该文有注释:第一层括弧实践是界说了一个外部匿名类(AnonymousInnerClass),第二层括弧实践上是一个实例初始化块(instanceinitializerblock),这个块在外部匿名类机关时被实行。
那怎样往更好了解它呢?假如我们写成以下的体例应当会更好了解吧,提个技能,在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();
应当没成绩了吧,下面是事务监听器和多线程经常使用的写法,假如他不把年夜括号连在一同,而是标准的写代码,信任您一入手下手也不会对所谓的DoubleBraceSyntax有太多的狐疑。要说这类初始化办法使用到汇合中还挺便利的,只是无故的多了些匿名类。
刚入手下手我看到这类双括符写法也是把它奉若圣经,对它只一孔之见,今天在用XStream把一个对象天生XML文件时,个中有一个List属性,我就借用了这类双括符法来初始化元素,了局天生的XML文件走了样,缘故原由是XStream的Converter能处置ArrayList,但没法很好的处置天生的ArrayList的匿名子类。因而才转头仔细的从头审阅了一番这个所谓的双括符初始化语法。
什么时候上述的三种开发工具能和三为一,什么时候java的竞争力才更强,才有机会拉拢更多的程序员投入到对java的开发上,因为到时的开发工具将会比.net网页编程的更简单。还有一点也很关键,什么时候java推出的jsf能成为真正意义上的标准。 |
|