把握现在,掌控未来:2008 Java开发展望

作者: ldsea 分类: 程序生活 发布时间: 2008-04-14 16:00

[color=#0000FF][size=4]2007 充满了激荡人心的事件,动态语言的不断升温,JVM在开源社区不断发展以及Java社区的重要贡献者,Google的崛起等。问题是,这些预示了来年什么 呢?安德鲁•格勒弗(Andrew Glover)准备了一些答案给那些打破砂锅问到底的Java开发者――现在,什么在2008接踵而至。

法国诗人保尔•瓦雷里曾经伤心地写下“困扰我们这个时代的是,未来,并不像过去看上去的那样”。然而,对于我们这些生活在Java平台崛起推动的互联网时代的人来说,瓦雷里多年前留下的这些诗句是永恒的。

过去的十多年,我们见证了Java Applet的兴起和没落,见证了EJB头顶上光环的不断暗淡,见证了JSF,Spring和Struts的异军突起(暂且不谈Struts渐渐显露的颓 势),见证了Java已经重新定义成为一种语言和一个平台。Java平台已经衍生出三个分支(标准版本,企业版本,微型版本),JDK也开放给了开源社 区。Java语言扩充了,包含了注解,范型,枚举类型,高级集合类型,还有更多。它也开始与动态语言,如Groovy,JRuby和Rhino等,共享 Java运行时(JRE)。事实上,如果稍稍留神一下,我们在过去的几年里注视着Java不断地从一种语言演变成为一个真正的平台。

在最近的十年里,我们知道Java已经不仅仅局限于一种语言或者一个平台了:它是一个社区,一个经济生态系统,一个鲜活的实体,而且这个实体已经发展成熟,成为了丰富的应用程序,或大或小公司的真正的生命线。

因此,尽管流言不少,我还是坚持认为Java在2008会持续红火。与其拿起卦子掐算未来,我们不如回顾一下过去的一年的趋势以及发生的重大事件。这些事件汇集起来,它们会告诉我们2008将发生什么。

遍地开花

2007 年犹如过山车一样,非常引人注目。人们对动态语言的不断关注, JVM在开源社区不断发展以及Java社区的重要贡献者,Google的崛起。更多的是,单元测试,持续化集成和其他敏捷开发技术得到了更广泛的接受,这 些都表明Java开发者开始认识到我们的技艺是一门有责任要求的行业。我们终于开始重视代码的质量和寿命,将其与推向市场的速度,或者是在企业的即时应用 放到同等重要的地位上来。

每个人都说,2007年有一些绝对的胜利,但是同时也有一些失望和争论,这给Java社区产生了超出预期更多的阻碍。留心一下以下这些体现过去一年的重大因素。

动态语言的成熟

随着1.0以及随后的1.5版本的发布,Groovy在2007的发展达到了一个关键的里程碑。走过过去5年或者多年的历程,Groovy没有替代Java,相反定位成了Java运行时(JRE)的补充语言。

Groovy的大卖点是简练的语法,简化了日常的开发工作。例如,打开和读取一个文件在Java语言是典型的冗长结构:

try {BufferedReader in = new BufferedReader(new FileReader(path)); String line; while((line = in.readLine()) != null){System.out.println(line); }in.close(); }catch(IOException e){System.err.println(“Exception reading”); }

但是同样的代码,Groovy可以写的更加敏捷:

new File(path).eachLine{ line ->println line}

根本上,Groovy像其他动态语言一样,可以让你扔掉异常处理,类型和分号,还可以使得代码更加简练,而代码简练最终使得代码的可读性更强(是的,上面那个File对象是一个Java java.io.File对象)。

把网撒开

然而,Groovy并不是2007年动态语言阵营的唯一参与者。2006年发布的Java 6版本引入了一个与动态语言交互的标准API,很多Java开发者在去年临近年底才开始体验。对该API进行旗舰式集成的是Rhino。但是,看起来在 Java7版本发布时还会有更多集成进来。

最早进行集成的语言之一不容置疑是JRuby,1.0版本的发布和令人咋舌的比Ruby本身运行速度还快的实现,使得它备受瞩目。像Groovy一 样,由于可以使用更加宽松的语法,加入了一些特殊机制的JRuby(它可以使 RubyJVM里运行,且与正常的Java对象交互)使Java开发更加简单。例如,使用Ruby可以增强标准的对象,象用Ruby的String操作会 更加容易。在标准的Java里,检查一个String实例是否为空值可能要做象如下方法的一样的操作(这是一个Apache commons-lang的 isBlank实现)。

public static boolean isBlank(String str) {int strLen; if (str == null || (strLen = str.length()) == 0) {return true; }for (int i = 0; i < strLen; i++) {if ((Character.isWhitespace(str.charAt(i)) == false)) {return false; }}return true; }
在Java 里,String是一个final类,所以你无法为了让String类型支持一个象isBlank的方法而扩展它。后果是,你不得不依赖第三方类库,象 common-lang。有了Ruby,你就可以在Ruby的String上另外定义一个blank方法,如:

class Stringdef blank?empty? || strip.empty?endend

实际上,Ruby式的动态允许运行时添加额外的行为到核心类库或任意对象(象给String增加一个blank?方法)。更进一步,JRuby可以进行反作用对核心Java对象增加方法。因此,稍一施法就可以给Java String类添加一个blank方法。

开放Java核心

07年Java的开源意味Java平台的发展不再由Sun核心工程师们说了算了:现在它的前途由我们掌握了。对Java类库,Javac,甚至JVM本身都采取GPL协议,OpenJDK保证将会开创一个创新的周期。实际上,我们已经看到了。

在2007 年十月,一个名为Multi-Language VM的项目在OpenJDK旗下开展了。这个项目旨在通过修改Java的底层架构,实现“以JVM特性为原型,高效支持Java之外的语言”。很明显,这 项目结合了07年最令人振奋的两个发展潮流,也就是围绕在动态语言的热衷和OpenJDK,这宣称我们处在了一个Java核心创新的时代。

Sun 的开放当然不是从OpenJDk开始的,而是Glassfish,作为Sun支持的开源应用服务器,它在2007自始至终获得了社区更多的追捧。最近,我 们无法忽略Sun对MySQL AB的收购,MySQL背后的公司是MySQL AB,而MySQL似乎是当今最流行的开源数据库。

所有这些发展都表明Java的鼻祖采取了一种受开源软件很大影响的商业模式。这意味我们在2008或者更远将看到Java平台更多的开放。当然,这会对Java生态系统的商业方面产生深远影响。相比最近Oracle以70十亿美金收购BEA,这似乎很绿色,很健康。

Google flexes

移动Java领域曾经变的不景气,但是临近2007年尾时,却因Google的Android平台的发布而重焕青春。Android的目标是为新一 代移动设备引入应用软件,且运行在由Google主导的开源操作系统之上。虽然Android是一个完整的平台(很像Java),但是构建Android 应用程序的SDK却是建立在Java之上。

此外,Android的Java与J2ME的Java截然不同。实际上,在JVM层面,Android的JVM就已相当独特了。除了运行专门为 Android而设计,高度优化的字节码格式的代码,它不可以运行标准Java字节码。移动设备上运行不同实现的Java意味这我们将可以看到一些有趣的 应用程序――当然,这也仅进一步说明了Java的无处不在。

2007 年Google在Java世界移动领域之外也进展的很顺利。但是,备受关注的是Guice的发布,Guice是一个基于Java 5注解和范型的依赖注入开源框架。虽然IOC市场上的佼佼者还是Spring,因其摒弃XML文件,提倡使用注解和Guice本身的Module类型,注 定了Guice在公开发布时就是一个先行者。

考虑到Google对第二代IOC框架的影响和Google AdWrods本身的基础架构都是依赖Guice的,Guice在来年很有可能将得到更多的关注。

敏捷成为主流――测试时代到来了

敏捷(agile)这个名称对大家来说并不新鲜,单元测试与持续化集成也不陌生。不过,2007年似乎是这些实践更加成为主流的年份。你不会碰到一 个会议里没有一到两个关注在敏捷上的演示的。再哆嗦几句,瞥一眼2008年度Jolt Award大奖关于综合性和技术性书籍(从2007年甄选的)的最终名单,就可以看出关于单元测试和持续化集成的书籍占有一席之地。然而,更重要的是,不 管是享有盛誉的,还是刚刚发展的框架都已经开始宣称它们的架构是多么容易地进行测试了。似乎,开发人员的测试时代终于到来了。

Java成长之痛

Java在不断的成长,不断的扩充,然而它在逐渐变化成为一个平台,而不仅仅是一种语言。不知是好还是坏,独具特性的东西一直在不断的添加进来,以后还将会有,社区会接受特性吗?

然而,一些特性就没有其他特性那样受欢迎了。举个例子来说,注解就很受欢迎――象JUnit4, TestNG, Spring和Google的Guice这些框架,由于对注解的创新的使用,就得到了不少开发人员的青睐。相反的是,到目前为止,人们对范型(在Java 5中引入)并没有保持对其自始至终的热情。

闭包(Closure)未见踪影

如果范型不足以使编程的前景变的灰暗,有人可能会发现当前围绕关于在Java 7 foggy中加入闭包和局部函数提议的争论。虽然我绝不会否认它们是有用的组成部分,只是,将它们增加到Java语言的语义中,概念的复杂性增加只会降低它们的有用性。

例如,在一个闭包的典型参考实现中,找到如下代码,它定义了一个简单的支持整数加法的闭包:

{Integer,Integer=>Integer} plus1 = {Integer x, Integer y => x+y};
非常有趣的是,由于Java天生的对语义要求,语句变的拖沓冗余――用Groovy来重写同样功能,却很容易。例如

plus1 = { x, y -> x+y }

注意到,在Groovy的例子中,类型的缺失无疑使得代码的意图一目了然。当然,Ruby版本也会同样简明扼要。

显然,象动态语言普遍受到欢迎此类的外部力量在不断地影响Java。如果想使用闭包,你完全不必等待Java自带的闭包――Groovy和JRuby对其的支持就已经很优雅。

真正的并发

Java7 值得期待的其他事情是java.util.concurrent包的发布,这个包致力于通过充分利用底层硬件来达到真正的并发。虽然Java已经支持多线 程,但是通过对并行性的进一步重视,硬件资源将变的越来越健壮。最终,Java语言也发展的可以应付这些要求。

由JSR 166专家组领导的Java 7将很有可能包含一些新特性,包括名为join-fork的细粒度的并行计算框架。好消息是,看起来这些新特性是崭新的类(和API),与生俱来就不符合句法规则。

奔向RIA

07年,特别是Sun在2007年JavaOne上让JavaFx对公众面世后,RIA(Rich Internet Application)继续让Java Web应用程序开发人员产生莫大的兴趣。JavaFX产品家族现在由JavaFX Script和JavaFX Mobile组成。

由于开发类Ajax应用的JavaScript无处不在,对 JavaFx的反应显得见仁见智。看起来JavaFX将会加剧本来就已经四分五裂的移动环境之间的裂缝。很多人感觉JavaFX的公告有点操之过急,还有 一些人怀疑它究竟是不是一个雾件。不管怎样,Sun进入RIA领域传达了一个长期战略的消息,这会使Java的前景更加光明。

结束语

有个非洲谚语说“明天属于那些今天为它准备的人”。因此,Java的未来(至少来年)已经孕育了一段时间了。2008年的大事的很大部分将不仅由 JVM本身促成,而且也会随着JRuby和Groovy不断受欢迎,最终得到更多厂商的采纳而形成。由于Google Android的出击和Sun JavaFX Mobile的发布,使用Java开发用户移动应用的前景也好像比以前更加容易到达了。大部分人的注意力将被多核系统的出现吸引过去,期待Java 7 java.util.concurrent包对其的回应。最后,围绕它的开源的Java和商业模型也会不断的成长。

作者简介

Andrew Glover是Stelligent Incorporated的总裁,Stelligent Incorporated是一家帮助开发团队加速软件开发的咨询公司。他的blog通常是thediscoblog.com和testearly.com。[/size][/color]

发表回复

您的电子邮箱地址不会被公开。