美文网首页
Groovy:方法和运算符重载

Groovy:方法和运算符重载

作者: lv_mock | 来源:发表于2020-03-19 22:15 被阅读0次

    方法调用

    定义的类的变量会自动生成get和set方法
    class Person {
        def name
        def age
    }
    def person = new Person()
    person.setName("Jack")
    println person.getName()  //Jack
    println person.name  //Jack
    
    赋值和取值会自动调用set和get方法
    class Person {
        def name
        def age
        def setName(name) {
            println 'call set'
            this.name = name
        }
        def getName() {
            println 'call get'
            return name
        }
    }
    def person = new Person()
    person.name = 'jack'
    println person.name  //Jack
    //输出:
    //call set
    //call get
    //jack
    
    class Person {
        def name
        def age
        def setName(name) {
            this.name = name
        }
        def getName() {
            return name + "!"
        }
    }
    def person = new Person()
    person.name = 'jack'
    //以下四种都会调用get方法,没区别
    println person.name  //jack!
    println person.'name' //jack!
    def str = 'name'
    println person."$str" //jack!
    println person['name'] //jack!
    //直接获取name的值
    println person.@name  //jack
    
    class Person {
        def name
        def age
        def setName(name) {
            println 'setName'
            this.name = name
        }
        def getName() {
            println 'getName'
            return name + "!"
        }
    }
    Person p = new Person(name:'jack')
    println p.name
    //输出
    //setName
    //getName
    //jack!
    

    在构造函数中可以给对象的变量赋默认值,赋值时会自动调用该变量的set方法

    def func(x = 0, y, z) {
        println "$x - $y - $z"
    }
    func(1, 5, x: 1, y: 2, z: 3)
    func(1,  x: 1, y: 2)
    func(1, [1, 2, 3], 4)
    func(1, [1, 2, 3])
    //输出
    //[x:1, y:2, z:3] - 1 - 5
    //0 - [x:1, y:2] - 1
    //1 - [1, 2, 3] - 4
    //0 - 1 - [1, 2, 3]
    

    键值对默认会赋值给第一个参数

    def str = 'org.codehaus.groovy:groovy-all:2.3.11'
    def (group,name,version) = str.split(":")
    println group + '--' + name + '--' + version
    def (group2,name2) = str.split(":")
    println group2 + '--' + name2
    //def (group3,name3,version3,x) = str.split(":") //Error:ArrayIndexOutOfBoundsException
    //输出
    //org.codehaus.groovy--groovy-all--2.3.11
    //org.codehaus.groovy--groovy-all
    
    interface OnClickListener {
        void onClick()
    }
    
    void func(OnClickListener listener) {
        listener.onClick()
    }
    
    func {
        println 'call'
    }
    //输出
    //call
    
    interface OnClickListener {
        void onClick()
    }
    
    void func(OnClickListener listener) {
        listener.onClick()
    }
    
    OnClickListener listener = {
        println 'call'
    }
    func listener
    //输出
    //call
    

    调用函数时 如果需要传递一个接口,那么可以使用闭包来代替

    interface A{
        void a()
        void b()
        void c()
    }
    def a = {
        println 'aaa'
    } as A
    a.a()
    a.b()
    a.c()
    //输出
    //aaa
    //aaa
    //aaa
    

    as能够将闭包转换成函数需要的接口对象

    操作符重载

    class Weight {
        def number
    
        def plus(weight) {
           if(weight instanceof Number) {
              number += weight;
           } else if(weight instanceof Weight) {
               number += weight.number
           } else {
               throw new MissingMethodException('plus',weight.class,weight)
           }
        }
    
        def isCase(a) {
            if(a instanceof Weight && a.number == 26 && number == 100 ) {
                true
            }  else {
                false
            }
        }
    }
    def weight = new Weight(number: 10)
    def weight2 = new Weight(number: 11)
    println weight + 5
    println weight + weight2
    switch (weight) {
        case new Weight(number:99):
            println "AAA"
            break
        case new Weight(number:100):
            println "BBB"
            break
        case 10:
            println "CCC"
            break
    }
    //输出
    //15
    //26
    //BBB
    

    switch(a) { case(b) : } ==> b.isCase(a)

    相关文章

      网友评论

          本文标题:Groovy:方法和运算符重载

          本文链接:https://www.haomeiwen.com/subject/oxrryhtx.html