Groovy与Java的区别
Groovy与Java的区别
不战则亡 发表于3年前
Groovy与Java的区别
  • 发表于 3年前
  • 阅读 277
  • 收藏 4
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: 大过年的,被公司的罗大牛坑在公司上班,简直苦不堪言,寂寞难耐啊。既已被坑,倒不如在公司学点啥。之前一直想研究研究Groovy,苦于项目比较忙一直没时间。这下倒好,有一个星期的时间让我慢慢研究。俗话说得好好,择日不如撞日,就从今天开始。官网上说groovy拥有当前流行编程语言的特性,对于java程序员来说,几乎是0学习成本的,无奈智商比较拙急,0学习成本是不可能的了,还是老老实实的学吧。正好官方也给出了groovy不同于java的文档,由于英文比较差,借助软件翻译以作记录,以便以后查看。 <br \>PS:菜鸟级别的翻译,高手飘过,勿喷!

##默认以BigDecimal类型来进行数学计算 浮点数默认的是BigDecimal类型,因此3.14不会被Groovy创建成doublefloat,而被创建成BigDecimal。这导致人们相信Groovy的计算效率非常低下。 如果你确实想用floatdouble类型,一定要为变量加上floatdouble关键字,如下: <pre class="brush:groovy"> double piDouble = 3.14 float piFloat = 3.14?? </pre> 或者,你也可以使用后缀的形式来指定,例如: <pre class="brush:groovy"> def piDouble = 3.14d def piFloat = 3.14f?? </pre> 你也可查看Groovy数学计算章节。 ##默认引入的包 下面的所有包和类在默认情况下已经被引入,也就是说,你不再需要引入下面这些包了:

  • java.io.*
  • java.lang.*
  • java.math.BigDecimal
  • java.math.BigInteger
  • java.net.*
  • java.util.*
  • groovy.lang.*
  • groovy.util.*

##常见错误 如果你是java程序员,下面这个列表可能就是你经常会弄错的地方:

  • 在所有类型下==都等于equals()。在Java当中,原始类型进行比较,==即为equals(),对象进行比较,==的意思是值相等。自从我们使用了自动包装之后,这个问题对Java开发者来说就有些混淆了。为了简单起见,在Groovy中,==就是equals()。假如你确实需要判定值相等,你可以使用像(foo.is(bar))这样的is()方法。is()方法不支持null,但是在这里你依然可以使用==,例如:foo==null
  • 在Groovy当中,in是关键字,因此,你不能把他当作变量名来使用。
  • 定义数组的时候,你不能写成这样
    <pre class="brush:groovy"> int[] a = {1,2,3}; </pre>
    而必须写成这样
    <pre class="brush:groovy"> int[] a = [1,2,3]; </pre>
  • 假如你想写一个像下面一样的for循环
    <pre class="brush:groovy"> for (int i=0; i < len; i++) {...} </pre>
    在groovy当中,你当然可以使用上面这种方式,但是你也可以只使用一个计数变量替代他,如:
    <pre class="brush:groovy"> for (i in 0..len-1) {...} </pre> 或者
    <pre class="brush:groovy"> for (i in 0..< len) {...} </pre>
    或者
    <pre class="brush:groovy"> len.times {...} </pre>

##需要注意的事情

  • 分号是可选的,用不用就看心情了(当然,多个表达式在同一行的情况下,你必须是他来分隔)。
  • return关键字是可选的。
  • 在静态方法内部,你可以使用this关键字,用于引用该类。
  • 类和方法在默认情况下都是public
  • protected修饰符在Groovy中和在Java中是一样的。也就是说,在同一个包和派生类当中,他们是友好可见的。
  • 方法签名中的throws子句在Groovy编译器中是不被检查的。因为检查与否的异常没有区别。
  • 你讲无法获取编译错误,就像java中的undefined成员或传递了错误的类型。猛戳运行时VS编译时,静态VS动态

##常见陷阱 Java程序员用分号来来终止语句而并不使用闭包。它们在类定义的时候初始化实例,所以你可能有时候会看到如下的代码: <pre class="brush:groovy"> class Trial { private final Thing thing = new Thing ( ) ; { thing.doSomething ( ) ; } } </pre> 许多Groovy程序员避开使用分号(有的却一直在使用分号 - 这是编码风格的问题。)。这导致了上述代码的书写困难,如下: <pre class="brush:groovy"> class Trial { private final thing = new Thing ( ) { thing.doSomething ( ) } } </pre> 这将抛出MissingMethodException异常! 这里的问题是,在这种情况下,换行符不是一个语句结束,因此下面的代码快被当成闭包来处理,作为参数传递给Thing的构造函数。对许多人来说这很诡异,但这是事实。假如你想通过这种方式来初始化实例,实际上是强制需要分号的: <pre class="brush:groovy"> class Trial { private final thing = new Thing ( ) ; { thing.doSomething ( ) } } </pre> 这种方式初始化后的块定义显然是初始化一个实例。 另外一个文档列出了一些你必须知道的误区和一些最佳实践以避免这些陷阱。 ##Java中不可用的一些Groovy新特性

  • 闭包
  • lists和maps的源生语法
  • GroovyMarkup和GPath的支持
  • 源生支持正则表达式
  • 多态迭代和强大的switch表达式
  • 动态和静态类型君已经被支持 - 因此你可以在方法、属性、变量当中省去类型声明
  • 字符串当中可以内嵌表达式
  • 越来越多的帮助方法(或许应该翻译成工具方法)被添加到JDK
  • 更加简单的语法编写bean属性和事件监听
  • Safe navigation使用?.操作符。例如variable?.fieldvariable?.method() - 没有更多的if嵌套来堆积你的代码。
标签: groovy
共有 人打赏支持
不战则亡
粉丝 2
博文 5
码字总数 5090
×
不战则亡
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: