飘灵儿 发表于 2015-1-18 11:21:03

了解下JAVA的也说Java的双括符初始化:实在就是使人隐晦的不标准代码

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能成为真正意义上的标准。

蒙在股里 发表于 2015-1-20 20:53:00

你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?

精灵巫婆 发表于 2015-1-28 05:25:36

关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。

谁可相欹 发表于 2015-1-31 19:33:57

是一种将安全性(Security)列为第一优先考虑的语言

因胸联盟 发表于 2015-2-6 21:28:31

应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展

小魔女 发表于 2015-2-8 06:14:13

是一种语言,用以产生「小应用程序(Applet(s))

爱飞 发表于 2015-3-5 21:14:28

http://www.jdon.com/去下载,或到同济技术论坛的服务器ftp://nro.shtdu.edu.cn去下,安装上有什么问题,可以到论坛上去提问。

活着的死人 发表于 2015-3-10 20:23:10

还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。

小妖女 发表于 2015-3-17 09:41:03

我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。

admin 发表于 2015-3-24 06:08:08

接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。
页: [1]
查看完整版本: 了解下JAVA的也说Java的双括符初始化:实在就是使人隐晦的不标准代码