zoukankan      html  css  js  c++  java
  • Groovy学习:第四章 Groovy特性深入

    作者:chszs

    1. 断言

    Java开发者常常使用JUnit或TestNG做单元测试,所以对断言是很清楚的。断言是用于验证假设的条件是否为真。在Groovy的断言中,如果假设的条件不为真,那么就会抛出java.lang.AssertionError异常。使用Groovy表达式来测试假设条件。
    比如:
    groovy:000> assert 1==2 : "One isn't Two"
    ERROR java.lang.AssertionError:
    One isn't Two. Expression: (1 == 2)
            at groovysh_evaluate.run (groovysh_evaluate:2)
            ...

    Java的断言也是这么写的:
    assert 1==2 : "One isn't Two";

    可见,Groovy的断言语法与Java的断言相同,Groovy的断言可以省略分号。

    断言的使用技巧:
    当你使用断言时,你应用包含一条消息。此消息可以帮助其他人维护和理解你的代码,理清你的意图。

    2. 强断言

    Groovy的断言assert关键字仅仅是检查表达式是否为真。如果为假,断言仅仅告诉开发者,表达式不成立,以及表达式使用的变量值,除此以外什么都没有。如果使用强断言,断言的输出会提供表达式的每一个子表达式的可视化展现。下面我将详细说明强断言。

    groovy:000> assert 1==1: "One isn't Two"
    ===> null
    groovy:000> assert new File('HelloWorld.txt')==new File('Hello.txt')
    ERROR org.codehaus.groovy.runtime.powerassert.PowerAssertionError:
    assert new File('HelloWorld.txt')==new File('Hello.txt')
           |                         | |
           HelloWorld.txt            | Hello.txt
                                     false
            at groovysh_evaluate.run (groovysh_evaluate:2)
            ...

    断言可以方便地对代码进行测试。

    3. Strings

    Groovy支持两种字符串:常规的Java字符串和GStrings。
    在Groovy中,用单引号或双引号括起来的字符串是java.lang.String类的一个实例,

    GStrings是groovy.lang.GString类的一个实例,它允许在文本中包含占位符。GStrings并不是String的子类,因为String类是final类型,而且是不能被扩充的。
    GString很像普通的字符串,但是他允许在其内使用${..}嵌入变量。如果内嵌的变量只是占位符,那么可以省略{}花括号。

    Groovy支持一些编程语言如Perl或Ruby所谓的字符串插入(String Interpolation)。字符串插入是字符串内的表达式或变量的替代。如果你熟悉Unix Shell编程或Ruby、Perl编程,那么你应该很熟悉这一点。

    Java不支持字符串插入,你必须手动的进行值连结。

    Java的字符串操作例子:
    String name = "Jim";
    String helloName = "Hello " + name;
    System.out.println(helloName);

    如果是使用Groovy的GString,那么可以这样:
    groovy:000> str1 = "Li Sir"
    groovy:000> str2 = "Hello "
    groovy:000> println "$str2$str1"
    Hello Li Sir

    可见,正如前面所讲,如果内嵌的变量只是占位符,那么可以省略{}花括号。
    当Groovy看到表达式内的内嵌变量时,Groovy会构造一个org.codehaus.groovy.runtime.GStringImpl来代替java.lang.String。当访问GString时,表达式会被重新计算。
    注意,你可以在${}内包含任意有效的Groovy表达式,可以是方法调用或变量名。

    4. 单行字符串

    单行字符串可以用单引号或双引号包围,但是两者是有区别的。
    单引号包围的表达式,里面的字符串插值是不会被识别的。双引号包围的表达式正好相反。

    举例:
    name = "LiSir"
    s1 = 'Hello $name'
    println s1

    输出:
    Hello $name

    例子:
    name = "LiSir"
    s1 = "Hello $name"
    println s1

    输出:
    Hello LiSir

    可见,由双引号定义的字符串,其内嵌的表达式会被解释。

    5. 多行字符串

    Groovy支持字符串跨越多行,多行字符串由三个双引号或者三个单引号定义。
    多行字符串对于创建模板(如XML模板)或内嵌的文档(SQL语句、HTML等)是非常有用的。还有很多用途。比如,可以使用多行字符串和字符串插值建立电子邮件的主体内容。
    比如:
    def name = "Jim"
    def multiLineQuote = """
    Hello, ${name}
    This is a multiline string with double quotes
    """
    println multiLineQuote
    println multiLineQuote.class.name

    def multiLineSingleQuote = '''
    Hello, ${name}
    This is a multiline string with single quotes
    '''
    println multiLineSingleQuote
    println multiLineSingleQuote.class.name

    输出:
    Hello, Jim
    This is a multiline string with double quotes
    org.codehaus.groovy.runtime.GStringImpl

    Hello, ${name}
    This is a multiline string with single quotes

    java.lang.String

    6. 斜线字符串

    正如早先提到的,斜线可以用于定义字符串。用斜线定义字符串有一个优点:那就是,字符串本身的内容无需转义反斜线。
    比如:
    def winpathQuoted = 'C:\windows\system32'
    def winpathSlashy = /C:windowssystem32/
    println winpathSlashy // C:windowssystem32
    assert winpathSlashy ==~ '\w{1}:\\.+\\.+'
    assert winpathSlashy ==~ /w{1}:\.+\.+/

    7. 多行斜线字符串

    斜线字符串还能够跨越多行。这一点对于多行正则表达式非常有用。
    比如:
    def name = "vishal"
    def path = "c:/groovy/"
    def multilineslashy = /
        Hello $name
    path $path
    dollar = $
    path = c:/groovy
    /
    println multilineslashy
    输出为:
        Hello vishal
            path c:/groovy/
            dollar = $
            path = c:/groovy

    8. 斜线字符串中的美元符号$

    在多行斜线字符串中,如果字符串内出现斜线/,那么它需要被转义。另外,如果字符串内出现了$美元符号(没有用于表达式时),也需要转义,否则会报MissingPropertyException异常。
    比如:
    def name = "vishal"
    def path = "c:/groovy"
    def multilineSlashy = /
      Hello $name
    path = $path
    dollar = $test
    path = c:/groovy
    /
    println multilineSlashy
    输出:
    Exception thrown
    四月 17, 2013 9:11:24 下午 org.codehaus.groovy.runtime.StackTraceUtils sanitize
    WARNING: Sanitizing stacktrace:
    groovy.lang.MissingPropertyException: No such property: test for class: ConsoleScript3
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:50)
    at org.codehaus.groovy.runtime.callsite.PogoGetPropertySite.getProperty(PogoGetPropertySite.java:49)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:231)
    at ConsoleScript3.run(ConsoleScript3:3)
    at groovy.lang.GroovyShell.runScriptOrMainOrTestOrRunnable(GroovyShell.java:257)
    at groovy.lang.GroovyShell.run(GroovyShell.java:481)
    at groovy.lang.GroovyShell.run(GroovyShell.java:163)
    at groovy.lang.GroovyShell$run.call(Unknown Source)
    at groovy.ui.Console$_runScriptImpl_closure17.doCall(Console.groovy:951)
    at groovy.ui.Console$_runScriptImpl_closure17.doCall(Console.groovy)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233)
    at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:909)
    at groovy.lang.Closure.call(Closure.java:411)
    at groovy.lang.Closure.call(Closure.java:405)
    at groovy.lang.Closure.run(Closure.java:492)
    at java.lang.Thread.run(Thread.java:722)
    groovy.lang.MissingPropertyException: No such property: test for class: ConsoleScript3
    at ConsoleScript3.run(ConsoleScript3:3)

    http://blog.csdn.net/chszs/article/details/8774785

  • 相关阅读:
    UML画图
    UML笔记
    电脑启动顺序
    评教有感
    部署图
    活动图
    给八期授课之主板电池的思考
    给八期授课之人员分配的思考
    构件图
    cocos2dx获得机器语言
  • 原文地址:https://www.cnblogs.com/itommy/p/10610403.html
Copyright © 2011-2022 走看看