ITPUB??ì3
ITPUB论坛 » 动态语言 » Java帝国的王储——Groovy !之学习

新一届的微软MVP评选已经开始,欢迎各位推荐!

标题: Java帝国的王储——Groovy !之学习
离线 shiren1118
Groovy脚本小孩


来自 长春工业大学050507
精华贴数 0
个人空间 0
技术积分 1269 (1358)
社区积分 16 (8537)
注册日期 2007-3-14
论坛徽章:7
授权会员生肖徽章2007版:鸡开发板块每日发贴之星开发板块每日发贴之星ITPUB新首页上线纪念徽章开发板块每日发贴之星
开发板块每日发贴之星     

发表于 2007-11-19 09:57 
Java帝国的王储——Groovy !之学习

让我们来回顾一下主流语言的发展历程:机器语言(由01组成) -> 汇编语言 -> ... -> C语言 -> C++ -> Java -> ?

不知道大家有没有发现在语言发展过程中,存在这么一个规律:能成为未来主流语言的,必与当前主流语言属同一‘语系’,换句话说,由王子继承王位。

在C语言之前,似乎还处于‘春秋战国’,各种编程语言混战,于20世纪70年代,C语言成为‘秦始皇’,各种软件甚至操作系统也改用C语言编写。但可惜C语言是面向过程的,程序代码一多,逻辑流程就容易混乱,再加上全局变量和可运算指针的添乱,使程序员调试程序万般辛苦。

20世纪80年代,C++应运而生,它继承了C语言(包括C语言的语法),并添加了类等特性,使C++成为一种面向对象的语言。但C++的多继承,人工内存管理,从C语言那里继承的可运算指针等问题同样使程序员万般痛苦。

20世纪90年代,正当人们饱受煎熬的时候,Java诞生了,她去除了C++中的糟粕,保留了C++中的精华(包括语法),并添加了一些自己的特性,比如垃圾回收器,接口等。我听很多由C++转Java的朋友说过这么一句话:用Java写程序简直是一种享受。可惜Java的那优美的语法使之失去了‘轻盈’的身躯,程序员需要写相对比较多的代码来完成同样的功能。此外Java代码即使编译为class文件,也能被“高质量”反编译为Java文件获得源码。

21世纪初,Groovy( http://groovy.codehaus.org  背后有ThoughtWorks, Big Sky, G2One等公司的支持)横空出世,她几乎兼容Java的所有语法,并能无需转换直接利用Java所写的类及接口,在Spring2中可以透明地注入 Groovy对象(与注入Java对象没有任何区别),且拥有自己的一些‘敏捷’特性,如动态类型,Closure,Mixins等,以及对应J2EE中如JSP, Servlet的Groovy敏捷版--GSP以及Groovlet等,不但如此她还拥有Ruby最引以为傲的Ruby on Rails的对应实现版本但非克隆--Grails( http://grails.org  背后有Oracle的支持),此外Groovy代码编译为class文件后,即使不混淆,反编译后获得的Java源代码也“极难”读懂(换句话说,如果您能读懂这些反编译得来的源码,那您早就用不着hack人家的class文件了),原因是Groovy自身就是用Java编写的,class文件烙有 Groovy的印迹。?指代谁至今还不太明了,但Groovy至少已经具备了继承王位的必要条件--语言本身是利用当前主流语言所编写,并与当前主流语言的语法相似,且能够结束当前主流语言的弊病。

综上所述,选择Java世界中动态语言Groovy(Groovy = Java + Python + Ruby + Smalltalk),至少是明智的,不仅因为她是JVM上JCP全票通过的官方标准语言,更因为她身上具有王储的特质。Groovy之于Java犹如 Java之于C++。另外,由于Groovy本身就是用Java写的,所以对Groovy的‘投资’能够得到保值。因为Groovy的程序能运行于 JDK1.4+之上,所以Groovy的新特性(比如Groovy1.1中新添加的Annotations以及static import)不会像Java中的新特性(比如Java5中的Generics以及Annotations等)那样无法在旧版JDK上使用,这就起到了保值作用。如果说Java实现了跨平台,那么Groovy不仅实现了跨平台而且实现了跨Java平台。

[ 本帖最后由 shiren1118 于 2007-11-19 10:01 编辑 ]


__________________
今天的努力换取明天别人的尊重

Groovy脚本小孩的论坛


Groovy脚本小孩
只看该作者    顶部
离线 shiren1118
Groovy脚本小孩


来自 长春工业大学050507
精华贴数 0
个人空间 0
技术积分 1269 (1358)
社区积分 16 (8537)
注册日期 2007-3-14
论坛徽章:7
授权会员生肖徽章2007版:鸡开发板块每日发贴之星开发板块每日发贴之星ITPUB新首页上线纪念徽章开发板块每日发贴之星
开发板块每日发贴之星     

发表于 2007-11-19 10:03 
Groovy跻身TIOBE排名35 !
Groovy面世至今已有4年了,其间风波不断,但Groovy Team毅然挺过了那段灰色的岁月,迎来了金色的2007年。
即将发布的Groovy1.1Final将为2007年划上一个完美的句号,我坚信2008年将是Groovy & Grails年!


__________________
今天的努力换取明天别人的尊重

Groovy脚本小孩的论坛


Groovy脚本小孩
只看该作者    顶部
离线 shiren1118
Groovy脚本小孩


来自 长春工业大学050507
精华贴数 0
个人空间 0
技术积分 1269 (1358)
社区积分 16 (8537)
注册日期 2007-3-14
论坛徽章:7
授权会员生肖徽章2007版:鸡开发板块每日发贴之星开发板块每日发贴之星ITPUB新首页上线纪念徽章开发板块每日发贴之星
开发板块每日发贴之星     

发表于 2007-11-19 10:07 
1.闭包
先解释一下闭包的概念:
闭包是很多动态语言提供的一个很方便的功能,它有点像Java中的内部类,
不同的是闭包中只有一个方法,但这个方法可以有任意个参数。
下面看一个闭包的最简单的例子:

def closure={ param -> println "hello ${param}" }  
closure.call("world!")

def是一个关键字,相当于JavaScript中的Var,用来定义一个对象。
closure为闭包的名字。在大括号里面,参数和处理参数的语句用->隔开。
param是这个闭包的参数,参数的数目是任意的,不同的参数之间用","隔开。
下面处理这些参数的语句就可以直接调用这些参数了。

所有的闭包都是继承自groovy.lang.Closure类,闭包也是一个普通的类,
只是在Groovy中,这个语法比较特别。所以闭包也可以当作一个返回值。
或者当作一个参数传入一个方法。

闭包的返回值:
调用闭包的call方法,会有一个返回值,可以调用return来指定,如果不指定的话,
则返回闭包中最后一条有返回值的语句。

闭包可以调用的对象:
在方法里面,可以调用方法内的局部变量
作为类变量,可以调用类变量

关于0个参数以及对象it:
参数可以是任意个,没有参数就不需要"->"了。没有参数的话,但是传入了一个参数,
这个参数可以通过一个无类型的对象"it"来访问。比如上面的例子我们可以这么写:

def closure2={ println "hello ${it}" }  
closure2.call("world!")

关于闭包的调用:
定义以后就可以调用这个闭包,有两种方式,
closure.call("world!")
closure("world!")
这两种是没有任何区别的,第二个是第一个的简写


__________________
今天的努力换取明天别人的尊重

Groovy脚本小孩的论坛


Groovy脚本小孩
只看该作者    顶部
离线 shiren1118
Groovy脚本小孩


来自 长春工业大学050507
精华贴数 0
个人空间 0
技术积分 1269 (1358)
社区积分 16 (8537)
注册日期 2007-3-14
论坛徽章:7
授权会员生肖徽章2007版:鸡开发板块每日发贴之星开发板块每日发贴之星ITPUB新首页上线纪念徽章开发板块每日发贴之星
开发板块每日发贴之星     

发表于 2007-11-19 10:08 
2.集合的本地化语法
这个比闭包更容易理解,Groovy对collections, lists, maps, arrays的声明和使用
提供了语言级的支持,可以直接声明一个list和map,无需调用new方法创建一个List或者
map对象。


__________________
今天的努力换取明天别人的尊重

Groovy脚本小孩的论坛


Groovy脚本小孩
只看该作者    顶部
离线 shiren1118
Groovy脚本小孩


来自 长春工业大学050507
精华贴数 0
个人空间 0
技术积分 1269 (1358)
社区积分 16 (8537)
注册日期 2007-3-14
论坛徽章:7
授权会员生肖徽章2007版:鸡开发板块每日发贴之星开发板块每日发贴之星ITPUB新首页上线纪念徽章开发板块每日发贴之星
开发板块每日发贴之星     

发表于 2007-11-19 10:10 
看一个来自Groovy官方网站的例子:
def list = [5, 6, 7, 8]
assert list.get(2) == 7
assert list[2] == 7
assert list instanceof java.util.List

def emptyList = []
assert emptyList.size() == 0
emptyList.add(5)
assert emptyList.size() == 1


__________________
今天的努力换取明天别人的尊重

Groovy脚本小孩的论坛


Groovy脚本小孩
只看该作者    顶部
离线 shiren1118
Groovy脚本小孩


来自 长春工业大学050507
精华贴数 0
个人空间 0
技术积分 1269 (1358)
社区积分 16 (8537)
注册日期 2007-3-14
论坛徽章:7
授权会员生肖徽章2007版:鸡开发板块每日发贴之星开发板块每日发贴之星ITPUB新首页上线纪念徽章开发板块每日发贴之星
开发板块每日发贴之星     

发表于 2007-11-19 10:10 
与Java的区别如下:
1.通过[value...]的方式来声明
2.通过list[index]的方式来访问和赋值
3.通过[]来声明一个空的map


__________________
今天的努力换取明天别人的尊重

Groovy脚本小孩的论坛


Groovy脚本小孩
只看该作者    顶部
离线 shiren1118
Groovy脚本小孩


来自 长春工业大学050507
精华贴数 0
个人空间 0
技术积分 1269 (1358)
社区积分 16 (8537)
注册日期 2007-3-14
论坛徽章:7
授权会员生肖徽章2007版:鸡开发板块每日发贴之星开发板块每日发贴之星ITPUB新首页上线纪念徽章开发板块每日发贴之星
开发板块每日发贴之星     

发表于 2007-11-19 10:12 
developerWorks 中国  >  Java technology  >
实战 Groovy: Groovy 的腾飞

熟悉 Groovy 新的、遵循 JSR 的语法
        developerWorks
       
       
文档选项
        将此页作为电子邮件发送       

将此页作为电子邮件发送


级别: 中级

Andrew Glover, CTO, Vanward Technologies

2005 年 8 月 22 日

    随着 Groovy JSR-1(及其后续发行版本)的发布,Groovy 语法的变化已经规范化 —— 这意味着如果以前没有对此加以注意,那么现在是开始注意它的时候了。这个月,Groovy 的常驻实践者 Andrew Glover 将介绍 Groovy 语法最重要的变化,以及在经典 Groovy 中找不到的一个方便特性。

从我在 alt.lang.jre 的系列文章“Feeling Groovy” 中介绍 Groovy 开始,差不多有一年时间了。从那时起,通过发行许多版本,逐步解决了语言实现中的问题,并满足开发人员社区的一些特性请求,Groovy 已经成熟了许多。最后,在今年四月,Groovy 有了一个重大飞跃,它正式发布了新的解析器,该解析器的目标就是将这门语言标准化为 JSR 进程的一部分。

在本月“实战 Groovy”这一期的文章中,我将祝贺 Groovy 的成长,介绍通过 Groovy 非常好用的新解析器规范化的一些最重要的变化:即变量声明和闭包。因为我要将一些新 Groovy 语法与我在关于 Groovy 的第一篇文章中介绍的经典语法进行比较,所以您可以在另一个浏览器窗口中打开“ alt.lang.jre: 感受 Groovy”这篇文章。


__________________
今天的努力换取明天别人的尊重

Groovy脚本小孩的论坛


Groovy脚本小孩
只看该作者    顶部
离线 shiren1118
Groovy脚本小孩


来自 长春工业大学050507
精华贴数 0
个人空间 0
技术积分 1269 (1358)
社区积分 16 (8537)
注册日期 2007-3-14
论坛徽章:7
授权会员生肖徽章2007版:鸡开发板块每日发贴之星开发板块每日发贴之星ITPUB新首页上线纪念徽章开发板块每日发贴之星
开发板块每日发贴之星     

发表于 2007-11-19 10:13 
为什么会发生这些变化?

如果您一直在跟踪 Groovy,不管是阅读文章和 blog,还是自己编写代码,您都可能已经遭遇过这门语言的一、两个微妙的问题。在进行一些灵敏的操作,例如对象导航,特别是使用闭包的时候, Groovy 偶尔会遇到歧义性问题和语法受限的问题。几个月之前,作为 JSR 进程的一部分,Groovy 团队开始着手解决这些问题。四月份,随 groovy-1.0-jsr-01 发行版本提供的解决方案是一个更新过的语法以及一个用来对语法进行标准化的新语法内容解析器。
       
关于本系列

将任何一个工具集成到开发实践中的关键是:知道什么时候使用它,什么时候把它留在箱子中。脚本语言可以是工具箱中极为强大的附件,但是只有在将它恰当应用到适当的地方时才这样。为了实现这个目标, 实战 Groovy 是一个文章系列,专门介绍 Groovy 的实际应用,并教导您什么时候使用它们,以及如何成功地应用它们。

好消息是:新语法是对语言的完全增强。另一个好消息是:它和以前的语法没有很大不同。像所有 Groovy 一样,语法的设计目标是较短的学习曲线和较大的回报。

当然,符合 JSR 的解析器也给新 Groovy 带来一些与目前“经典”语法不兼容的地方。如果用新的解析器运行本系列以前文章中的代码示例,那么您自己就可以看,代码示例可能无法工作!现在,这一点看起来可能有点苛刻 —— 特别是对 Groovy 这样自由的语言来说 —— 但是解析器的目标是确保作为 Java 平台的标准化 语言的 Groovy 的持续成长。可以把它当作新 Groovy 的一个有帮助的指南。


__________________
今天的努力换取明天别人的尊重

Groovy脚本小孩的论坛


Groovy脚本小孩
只看该作者    顶部
离线 shiren1118
Groovy脚本小孩


来自 长春工业大学050507
精华贴数 0
个人空间 0
技术积分 1269 (1358)
社区积分 16 (8537)
注册日期 2007-3-14
论坛徽章:7
授权会员生肖徽章2007版:鸡开发板块每日发贴之星开发板块每日发贴之星ITPUB新首页上线纪念徽章开发板块每日发贴之星
开发板块每日发贴之星     

发表于 2007-11-19 10:13 
Groovy 依然是 Groovy!

在深入研究变化的内容之前,我要花几秒钟谈谈什么没有改变。首先,动态类型化的基本性质没有改变。变量的显式类型化(即将变量声明为 String 或 Collection) 依然是可选的。稍后,我会讨论对这一规则的一点新增内容。

知道分号依然是可选的时候,许多人都会感到轻松。对于放松对这个语法的使用,存在许多争论,但是最终少数派赢得了胜利。底线是:如果愿意,也可以使用分号。

集合(Collection)的使用大部分还保持不变。仍然可以用 array 语法和 map,像以前那样(即最初从文章“alt.lang.jre: 感受 Groovy”中学到的方式)声明类似 list 的集合。但范围上略有变化,我将在后面部分展示这一点。

最后,Groovy 对标准 JDK 类的增加没有发生多少变化。语法糖衣和漂亮的 API 也没变, 就像普通的 Java File 类型的情况一样,我稍后将展示这一点。


__________________
今天的努力换取明天别人的尊重

Groovy脚本小孩的论坛


Groovy脚本小孩
只看该作者    顶部
离线 shiren1118
Groovy脚本小孩


来自 长春工业大学050507
精华贴数 0
个人空间 0
技术积分 1269 (1358)
社区积分 16 (8537)
注册日期 2007-3-14
论坛徽章:7
授权会员生肖徽章2007版:鸡开发板块每日发贴之星开发板块每日发贴之星ITPUB新首页上线纪念徽章开发板块每日发贴之星
开发板块每日发贴之星     

发表于 2007-11-19 10:14 
容易变的变量

Groovy 的变量规则对新的符合 JSR 的语法的打击可能最大。经典的 Groovy 在变量声明上相当灵活(而且实际上很简洁)。而使用新的 JSR Groovy 时,所有的变量前都必须加上 def 关键字或者 private、protected 或 public 这样的修饰符。当然,也可以声明变量类型。另外,如果正在定义类,希望声明属性(使用 JavaBeans 样式的 getter 和 setter 公开),那么也可以用 @Property 关键字声明成员变量。请注意 —— Property 中的 P 是大写的!

例如,在“alt.lang.jre: 感受 Groovy”中介绍 GroovyBeans 时,我在文章的清单 22 中定义了一个叫做 LavaLamp 的类型。这个类不再符合 JSR 规范,如果要运行它,则会造成解析器错误。幸运的是,迁移这个类不是很困难:我要做的全部工作就是给所有需要的成员变量添加 @Property 属性,如清单 1 所示:

清单 1. LavaLamp 的返回结果

package com.vanward.groovy
class LavaLamp{
  @Property model
  @Property baseColor
  @Property liquidColor
  @Property lavaColor
}
llamp = new LavaLamp(model:1341, baseColor:"Black",
  liquidColor:"Clear", lavaColor:"Green")
println llamp.baseColor
println "Lava Lamp model ${llamp.model}"
myLamp = new LavaLamp()
myLamp.baseColor = "Silver"
myLamp.setLavaColor("Red")
println "My Lamp has a ${myLamp.baseColor} base"
println "My Lava is " + myLamp.getLavaColor()


不是太坏,不是吗?

正如上面描述的,对于任何 变量,如果没有修饰符、@Property 关键字或者类型,则需要具有 def 关键字。例如,清单 2 的代码在 toString 方法中包含一个中间变量 numstr ,如果用 JSR 解析器运行此代码,则会造成一个错误:


__________________
今天的努力换取明天别人的尊重

Groovy脚本小孩的论坛


Groovy脚本小孩
只看该作者    顶部
相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问