科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Groovy与Java的不同之处

Groovy与Java的不同之处

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文主要介绍了Groovy和Java之间的不同之处,供大家参考!

作者:梁婷婷 编译 来源:51CTO.com 2007年11月18日

关键字: Groovy java 不同

  • 评论
  • 分享微博
  • 分享邮件
Groovy试图使Java开发者使用起来尽可能自然,在设计Groovy的时候遵循这样的原则,那就是尽可能减少Groovy的突兀之处。尤其是对那些有着Java开发基础的人,他们学习Groovy,当然希望Groovy与Java不要差别过大。

下面我们说说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++) {...}
       
但是只能使用一个计数变量,在Groovy中也可以这样写:

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 {
private final Thing thing = new Thing ( ) ;
{ thing.doSomething ( ) ; }
}

很多Groovy程序员都想避免使用分号(当然还有很多人一直用分号,这只是个人的编码风格)。但问题是,直接就把上面的代码改成了这样的Groovy代码:

class Trial {
private final thing = new Thing ( )
{ thing.doSomething ( ) }
}

这将导致一个MissingMethodException异常!

产生这个异常的原因就是,这种情况下,新行并不表示一个语句声明的终止,所以接下来的这个空格就被当作了闭包的一部分,被解析成Thing构造函数的一个参数。很多人可能会觉得奇怪,但确实如此。所以,如果想在这种情况下初始化一个实例,就必须要写分号:

class Trial {
private final thing = new Thing ( ) ;
{ thing.doSomething ( ) }
}

这样,就使得实例的初始化变得清晰了。

Groovy的新特性(Java中没有的特性)

◆闭包(closures)
◆Lists和maps的语法
◆支持GroovyMarkup和GPath
◆支持正则表达式
◆特有的循环格式和强有力的switch语句
◆支持动态和静态的类型匹配 - 所以可以在声明方法,域,变量的时候省略类型声明。
◆可以在字符串里嵌入表达式
◆在JDK里新添加了很多帮助方法
◆语法更简单。所有属性都提供beans,并且增加了事件监听器
◆使用“?.”操作符安全导引。例如"variable?.field"和"variable?.method()"-不再需要嵌套if来检查代码的闭合性。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章