`
jboy
  • 浏览: 8857 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

Groovy和Java的区别

阅读更多

 

英文原文 http://groovy.codehaus.org/Differences+from+Java

 

Groovy和Java的区别

 

Groovy尝试使Java开发人员尽可能地觉得自然。在设计Groovy时,我们一直努力遵循“最少惊奇”的原则,尤其是对学习Groovy的那些有Java背景的开发人员。

 

在这里,我们列出了所有的Java和Groovy之间的主要区别。

 

默认的Imports

 

默认情况下,下面这些包和类都被导入了,也就是说,你没有必要使用一个显式的导入语句来使用它们:

 

java.io.*

java.lang.*

java.math.BigDecimal

java.math.BigInteger

java.net.*

java.util.*

groovy.lang.*

groovy.util.*

 

常见的问题

 

在这里,我们列出了一些常见的问题。 如果你是一个Java开发人员并开始使用Groovy,你可能会迷惑。

 

 

  • ==是比较任何类型相等的手段。在Java中有一个奇怪的语法,==意味着相等的原始类型和对象的同一性。自从我们使用了自动装箱,这将是非常容易迷惑Java开发人员的一件事(因为x == 5多半是false,如果x是5 - 5会被自动包装成Integer对象),所以为了简单起见,==在Groovy中表示equals(),如果你真的需要的表示同一性,你可以使用方法“is”,像这样foo.is(bar)。但是对于null这并不工作,但你仍然可以使用foo==null来判断。
  • in 是一个关键字。所以,不要把它作为一个变量名。
  • 声明数组时,你可以不写 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) {...} 或 len.times {...}

 

注意事项

 

 

  • 分号是可选的。如果你喜欢可以继续使用他们(如果把几个语句放在在同一行那么你必须使用他们)。
  • return关键字是可选的。
  • 您可以在静态方法中使用this关键字(表示这个类)。
  • 默认情况下,方法和类是public的。
  • protected在Groovy和Java中具有相同的含义。也就是说,同一个包的类和派生类也可以看到protected的成员。
  • 不支持内部类(非静态嵌套类)。在大多数情况下,你可以使用闭包代替,例如实现接口。支持静态嵌套类。
  • Groovy编译器不检查方法签名中的throws子句,因为在Groovy看来checked和unchecked异常之间没有什么区别。
  • 使用未定义的变量,或传递错误类型的参数不会得到编译错误,不像在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 ( ) }

}

这种方式下{}显然是一个实例初始化块的定义。

 

另一份文件列出了一些你应该知道的陷阱,并给出一些关于最佳实践的建议,以避免这些陷阱。

 

Java中没有但是Groovy有的功能

 

 

  • 闭包
  • list和map的内建语法
  • 支持GroovyMarkup和GPath
  • 原生支持正则表达式
  • 多样化的迭代和强大的switch语句
  • 支持动态和静态类型 - 因此你可以忽略的方法,字段和变量的类型声明
  • 在字符串中嵌入表达式
  • 许多新的辅助方法添加到JDK中
  • 简单的语法编写bean属性和添加事件监听器
  • 使用?运算符安全引用,例如"variable?.field"和"variable?.method()"- 不会再有很多检查null的if堵塞你的代码了

 

附: 本文中值得一看的超链接:

  • 闭包的介绍 - http://groovy.codehaus.org/Closures+-+Informal+Guide
  • 闭包实现接口 - http://docs.codehaus.org/display/GROOVY/Groovy+way+to+implement+interfaces
  • 最佳实践 - http://groovy.codehaus.org/Things+you+can+do+but+better+leave+undone

 

分享到:
评论

相关推荐

    groovy和Java相互调用1

    标题中的“Groovy和Java相互调用1”指的是在编程时如何在Groovy语言环境中调用Java类,以及反之,如何在Java程序中调用Groovy类。这是一种跨语言交互的方式,特别是在混合使用Groovy和Java的项目中非常常见。 ...

    Groovy+Java混合使用例子

    Groovy环境搭建教程中的例子工程,纯Java、纯Groovy以及Java+Groovy混合 教程参考:http://blog.csdn.net/rcom10002/archive/2011/06/26/6568557.aspx

    groovy与java的区别1

    总结起来,Groovy与Java的主要区别在于其更灵活的语法、丰富的内置功能(如闭包和元编程)、以及对脚本编写的支持。这些特性使Groovy在快速原型开发、脚本编写以及需要高度动态性的场合中成为理想的选择,同时在处理...

    Java中使用Groovy的三种方式

    本文将深入探讨在Java项目中使用Groovy的三种主要方式,并阐述它们各自的优势和应用场景。 一、作为嵌入式脚本 Java 6引入了JSR 223(Scripting for the Java Platform),允许在Java程序中直接执行脚本语言。...

    Java调用Groovy,实时动态加载数据库groovy脚本

    本文将详细讲解如何在Java应用程序中调用Groovy脚本,实现从MongoDB数据库中读取并实时运行Groovy脚本,以及其背后的原理和优势。 首先,Groovy是一种与Java高度兼容的脚本语言,它可以无缝地与Java代码集成,共享...

    groovy调用java-se类库学习案例 Java学习资料

    Groovy是一种基于JVM的动态编程语言,它与Java有着紧密的联系,可以直接调用Java的类库。...通过阅读和运行这些示例,你将能够深入理解Groovy和Java之间的互操作性,并掌握在实际开发中如何有效利用这一特性。

    [Groovy] Making Java Groovy 英文版

    Making Java Groovy is a practical handbook for developers who want to blend Groovy into their day to day work with Java It starts by introducing the key differences between Java and Groovy and how you...

    SpringBoot-Gradle-Maven-Java-Groovy

    SpringBoot、Gradle、Maven、Java和Groovy是Java生态系统中的重要组成部分,它们在现代软件开发中扮演着至关重要的角色。这篇详细的知识点解析将深入探讨这些技术及其相互关系。 1. **SpringBoot**: SpringBoot是...

    java 动态脚本语言 精通 Groovy

    5. **GDK (Groovy Development Kit)**:Groovy为Java集合、字符串和其他基本类型提供了丰富的扩展方法,称为Groovy Development Kit。这些方法使得操作数据更加便捷,例如: ```groovy def list = [1, 2, 3] list...

    hugo110-java_run_groovy-master_java_

    综上所述,这个项目可能是为了帮助开发者理解和实践如何在Java项目中集成和运行Groovy,以便更好地利用Groovy的动态性和简洁性,同时为实现定时任务和动态代码执行场景做准备。通过学习和实践这个项目,你可以掌握...

    java、groovy、C#、Javascript性能比较

    java、groovy、C#、Javascript的运行效率到底如何? 通过实验比较,Javascript的运行效率解决java,看来基于javascript的html5前途远大。 C#的Release版的运行性能也相当高,和C++相差不大,值得推荐。 文件内部...

    Java Groovy

    - **代码互操作性**:Groovy和Java之间可以直接相互调用方法和构造器,这种无缝的互操作性为项目带来了极大的灵活性。 - **迁移路径**:对于希望逐步迁移到Groovy的项目,可以从引入简单的Groovy脚本开始,逐渐扩大...

    基于groovy实现 java脚本动态编译、部署、发布;可以通过脚本直接调用dubbo接口.zip

    本文将深入探讨如何基于Groovy实现Java脚本的动态编译、部署和发布,并且介绍如何通过Groovy脚本直接调用Dubbo接口,从而提高开发效率和灵活性。 Groovy是一种基于Java平台的强大的动态编程语言,它具有简洁的语法...

    groovy-src-1.8.5.zip_.bzrignore_Groovy_Java 8_groovy src_lowern

    总的来说,这个压缩包对于Java和Groovy开发者来说是一个宝贵的资源,可以深入理解Groovy语言的实现细节,了解其与Java 8的兼容性,甚至参与到Groovy的改进和扩展工作中去。通过分析源代码,我们可以学习到动态语言的...

    精通 Groovy--下一代开发语言

    什么是 Groovy? Groovy 是 JVM 的一个替代语言 — 替代 是指可以用 Groovy 在 Java 平台上进行 Java ...Groovy 和 Java 语言的主要区别是:完成同样的任务所需的 Groovy 代码比 Java 代码更少。(有时候会少很多!)

    Java调用Groovy

    这篇博客文章“Java调用Groovy”可能会探讨如何在Java代码中执行Groovy脚本,以及这样做的优势和实践方法。 首先,Java可以通过`GroovyShell`或`GroovyScriptEngine`来执行Groovy脚本。`GroovyShell`是Groovy提供的...

    Java整合Groovy脚本笔记

    Java整合Groovy脚本,Java整合Groovy脚本Java整合Groovy脚本,Java整合Groovy脚本Java整合Groovy脚本,Java整合Groovy脚本Java整合Groovy脚本,Java整合Groovy脚本Java整合Groovy脚本,Java整合Groovy脚本Java整合...

    Groovy v2.4.13官方版

    Groovy 是用于Java虚拟机的一种敏捷的动态语言,它结合了Python、Ruby和Smalltalk的许多强大的特性。它是一种成熟的面向对象编程语言,既可以用于面向对象编程,又可以用作纯粹的脚本语言。使用该种语言不必编写过多...

    基于Groovy与Java融合的Groovy学习实践之路设计源码

    该项目是一套基于Groovy与Java融合的Groovy学习实践之路源码设计,总计包含91个文件,其中Groovy文件71个,XML文件6个,Java文件4个,Markdown...该套源码旨在帮助用户深入理解和掌握Groovy语言及其与Java的交互使用。

    Making Java Groovy源码

    Making Java Groovy Kenneth A. Kousen 1.Easier Java 2.Closures, builders, and metaprogramming 3.Gradle for builds, Spock for testing 4.Groovy frameworks like Grails and Griffon 源码

Global site tag (gtag.js) - Google Analytics