扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
下面我们说说Java和Groovy之间的主要的不同之处。
缺省引入的包
所有以下的这些包和类都是缺省引入的,也就是说不需要再特意使用import语句来引入它们。
◆java.io.*
◆java.lang.*
◆java.math.BigDecimal
◆java.math.BigInteger
◆java.net.*
◆java.util.*
◆groovy.lang.*
◆groovy.util.*
常见陷阱
用惯了Java的开发人员,开始使用Groovy,经常会在以下事情上栽跟头:
◆== 表示相等。而在Java的语法中,==表示类型相等,是同一个对象。这让Java开发人员感到很困惑(因为即使X等于5,再用x==5做判断却是不等的)。所以,为了简单方便,在Groovy中,== 就表示相等,相当于Java里的equals()。如果确实需要判断是否是同一对象,那么可以使用“is”方法,如foo.is(bar)。但“is”不能用于空(null)对象的判断,可以使用==来判断空值,如foo==null。
◆in 在Groovy里是一个关键字,切记不要使用它做变量名。
◆定义数组的时候,不可以写:
int[] a = {1,2,3}; |
需要写成:
int[] a = [1,2,3] |
◆for循环可以像原来那样写:
for (int i=0; i < len; i++) {...} |
for (i in 0..len-1) {...} |
或者:
for (i in 0.. |
或者:
len.times {...} |
需要知道的事情
◆分号可用可不用。当然如果一行中有多条语句,中间必须用分号隔开。
◆return关键字可有可无。
◆可以在静态方法中使用this关键字(表示当前类的引用)。
◆方法和类在缺省情况下是public。
◆在Groovy中,protected指包保护和Java保护。比如,可以在同一个包里定义友元,派生类也可以访问保护成员。
◆现在Groovy还不支持内部类(Inner classes),多数情况下,可以用closures代替。
◆Groovy编译器不检查方法名旁的throws子句。
◆如果程序员使用了未定义的成员或传递了类型不符的参数时,编译器不会像Java那样给出编译错误,关于这点,请参考Runtime vs Compile time, Static vs Dynamic。
不常见的陷阱
Java程序员习惯于用分号来结束语句,而且Java中没有闭包的概念。下面是一个例子,在一个类的定义中初始化另一个类的实例:
class Trial { |
很多Groovy程序员都想避免使用分号(当然还有很多人一直用分号,这只是个人的编码风格)。但问题是,直接就把上面的代码改成了这样的Groovy代码:
class Trial { |
这将导致一个MissingMethodException异常!
产生这个异常的原因就是,这种情况下,新行并不表示一个语句声明的终止,所以接下来的这个空格就被当作了闭包的一部分,被解析成Thing构造函数的一个参数。很多人可能会觉得奇怪,但确实如此。所以,如果想在这种情况下初始化一个实例,就必须要写分号:
class Trial { |
这样,就使得实例的初始化变得清晰了。
Groovy的新特性(Java中没有的特性)
◆闭包(closures)
◆Lists和maps的语法
◆支持GroovyMarkup和GPath
◆支持正则表达式
◆特有的循环格式和强有力的switch语句
◆支持动态和静态的类型匹配 - 所以可以在声明方法,域,变量的时候省略类型声明。
◆可以在字符串里嵌入表达式
◆在JDK里新添加了很多帮助方法
◆语法更简单。所有属性都提供beans,并且增加了事件监听器
◆使用“?.”操作符安全导引。例如"variable?.field"和"variable?.method()"-不再需要嵌套if来检查代码的闭合性。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者