<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    First they ignore you
    then they ridicule you
    then they fight you
    then you win
        -- Mahatma Gandhi
    Chinese => English     英文 => 中文             
    隨筆-221  評(píng)論-1047  文章-0  trackbacks-0
    Groovy和Java都習(xí)慣使用null來表示“空”這一概念,而對(duì)null的操作將引發(fā)NullPointerException(簡(jiǎn)寫為NPE),進(jìn)而影響系統(tǒng)的健壯性。為了避免NPE,Option模式應(yīng)運(yùn)而生,通過Option類型來標(biāo)識(shí)NPE風(fēng)險(xiǎn),其使用None對(duì)象表示“空”,并使用Some對(duì)象表示“非空”且持有值對(duì)象,最終提升了系統(tǒng)健壯性。

    1.使用Gradle管理項(xiàng)目,通過“gradle init --type groovy-library”生成項(xiàng)目結(jié)構(gòu)
    <項(xiàng)目根目錄>
    │  build.gradle
    │  gradlew
    │  gradlew.bat
    │  settings.gradle

    ├─.gradle
    │  └─2.12
    │      └─taskArtifacts
    │              cache.properties
    │              cache.properties.lock
    │              fileHashes.bin
    │              fileSnapshots.bin
    │              outputFileStates.bin
    │              taskArtifacts.bin

    ├─gradle
    │  └─wrapper
    │          gradle-wrapper.jar
    │          gradle-wrapper.properties

    └─src
        ├─main
        │  └─groovy
        │          Library.groovy
        │
        └─test
            └─groovy
                    LibraryTest.groovy

    2.編輯build.gradle,管理項(xiàng)目依賴
    /*
     * This build file was auto generated by running the Gradle 'init' task
     * by '山風(fēng)小子' at '16-8-13 下午3:03' with Gradle 2.12
     *
     * This generated file contains a sample Groovy project to get you started.
     * For more details take a look at the Groovy Quickstart chapter in the Gradle
     * user guide available at 
    https://docs.gradle.org/2.12/userguide/tutorial_groovy_projects.html
     
    */

    // Apply the groovy plugin to add support for Groovy
    apply plugin: 'groovy'

    // In this section you declare where to find the dependencies of your project
    repositories {
        // Use 'jcenter' for resolving your dependencies.
        
    // You can declare any Maven/Ivy/file repository here.
        maven { url 'https://dl.bintray.com/danielsun1106/generic/' } // 新增代碼
        jcenter()
    }

    // In this section you declare the dependencies for your production and test code
    dependencies {
        // We use the latest groovy 2.x version for building this library
        compile 'org.codehaus.groovy:groovy-all:2.4.7' // 新增代碼

        compile 'com.groovyhelp:groovy-option-support:1.0.1' // 新增代碼
    }

    // 新增代碼
    task run(type: JavaExec, dependsOn: 'classes') {
        classpath = sourceSets.main.runtimeClasspath
        main = "Library"
    }

    3.至此環(huán)境已準(zhǔn)備完畢,編輯src/main/groovy/Library.groovy,并執(zhí)行“gradle run”以開始我們Option模式體驗(yàn)之旅
    /*
     * This Groovy source file was auto generated by running 'gradle buildInit --type groovy-library'
     * by '
    山風(fēng)小子' at '16-8-13 下午3:03' with Gradle 2.12
     *
     * @author 
    山風(fēng)小子, @date 16-8-13 下午3:03
     
    */
    class Library {
        public static void main(String[] args) {
                println "*********** Option模式體驗(yàn)之旅 *************"
                    
                    def m = new HashMap() {
                        {
                            putAll([a: 1, b: 2, c: 3]); // 初始化
                        }

                        @Override
                        public Option get(Object key) { // 覆蓋HashMap的get方法,以返回Option對(duì)象,該對(duì)象通過Option.$new方法創(chuàng)建
                            return Option.$new(super.get(key));
                        }
                    }

                    // 由于get方法已通過Option標(biāo)示了NPE風(fēng)險(xiǎn),所以調(diào)用者有意識(shí)地使用$switch方法來分情況處理
                    m.get('b').$switch {
                            // 如果get的返回結(jié)果為Some(即“非空”),則執(zhí)行該閉包內(nèi)容
                        println "b對(duì)應(yīng)的值: $it";
                    } {
                        // 如果get的返回結(jié)果為None(即“空”),則執(zhí)行該閉包內(nèi)容
                        println "找不到b對(duì)應(yīng)的值";
                    }
                    
                    // $switch的另外一種使用方式,與上述方式相似
                    println 'b的查找結(jié)果:' + m.get('b').$switch { return it /* 返回b對(duì)應(yīng)的值 */ } { return 0 /* 如果沒有找到b,則返回0 */ }
                    
                    // 嘗試查找一個(gè)不存在的key(比如d)
                    m.get('d').$switch {
                        println "d對(duì)應(yīng)的值: $it";
                    } {
                        println "找不到d對(duì)應(yīng)的值";
                    }
                    
                    // 雖然是Option對(duì)象,但可以將其視作原始對(duì)象并訪問其方法及屬性
                    println """m.get('a').intValue()執(zhí)行結(jié)果: ${m.get('a').intValue()}"""
                    
        }
    }

    執(zhí)行結(jié)果:
    D:\_LAB>gradle run
    :compileJava UP-TO-DATE
    :compileGroovy
    :processResources UP-TO-DATE
    :classes
    :run
    *********** Option模式體驗(yàn)之旅 *************
    b對(duì)應(yīng)的值: 2
    b的查找結(jié)果:2
    找不到d對(duì)應(yīng)的值
    m.get('a').intValue()執(zhí)行結(jié)果: 1

    BUILD SUCCESSFUL

    Total time: 7.803 secs

    更多例子可以查看:https://github.com/daniellansun/groovy-option-support/blob/master/src/test/groovy/groovy/lang/OptionTest.groovy
    groovy-option-support項(xiàng)目主頁:https://github.com/daniellansun/groovy-option-support

    附:朝花夕拾——Groovy & Grails
    posted on 2016-08-13 16:17 山風(fēng)小子 閱讀(2297) 評(píng)論(0)  編輯  收藏 所屬分類: Groovy & Grails
    主站蜘蛛池模板: 天堂亚洲国产中文在线| 亚洲伦理一区二区| 国产精品无码亚洲精品2021| 一区二区无码免费视频网站| 亚洲国产日韩在线| 久久久久久免费视频| 亚洲中文字幕无码中文| 成年人免费视频观看| 国产亚洲欧美日韩亚洲中文色| 国产最新凸凹视频免费| 国产精品亚洲а∨无码播放麻豆| 免费看一级做a爰片久久| 亚洲天堂免费在线视频| 久久亚洲精品中文字幕三区| 特级精品毛片免费观看| 亚洲免费黄色网址| 日韩a级毛片免费视频| 全黄A免费一级毛片| 亚洲成a人片77777kkkk| 免费国产黄网站在线观看可以下载| 亚洲精品美女久久久久9999| 国产成人免费爽爽爽视频| 黄色毛片免费在线观看| 国产亚洲婷婷香蕉久久精品| 五月婷婷在线免费观看| 亚洲爆乳成av人在线视菜奈实| 亚洲成A人片在线观看中文| a毛片在线看片免费| avtt天堂网手机版亚洲| 国产成人免费A在线视频| 免费a级毛片无码a∨免费软件 | 黄色三级三级三级免费看| 亚洲伊人成无码综合网 | 亚洲色偷拍另类无码专区| 免费无码一区二区三区| 亚洲AV无码专区国产乱码不卡| 亚洲人精品午夜射精日韩| 四虎永久在线精品免费网址| 国产精品高清免费网站| 麻豆狠色伊人亚洲综合网站| 国产日产亚洲系列最新|