[TOC]

面向对象

变量声明范例

class SomeClass {
    public fieldWithModifier
    String typedField
    def untypedField
    protected filed1, filed2, filed3
    
    static ClassFiled
    
    public static final String CONSTA = 'a', CONSTB = 'b'
    
    def someMethod(){
        def localUntypedVar = 1
        int localTyoedVar = 1
        def localVarWithoutAssignment, andAnotherOne
    }
}

def localVar = 1  //脚本声明变量
boundVar = 1

def someMthod(){
    localMethodVar = 1
    boundVar2 = 1
}

//定位字段
class Counter{
    public count = 0
}

def counter = new Counter()
counter.count = 1
assert counter.count == 1
def fieldNam = 'count'
counter[fieldName] = 2
assert counter['count'] == 2

方法声明

方法返回值声明

class SomeClass{
  static void main(args){
    def some = new SomeClass()
    assert 'hi' == some.publicUntyedMethod()
    assert 'ho' == some.publicTypedMethod()
    combineMethod()
  }
  
  void publicVoidMethod(){}
  def pubicVoidMethod(){
    return 'hi'
  }
  String publicTypedMethod(){
    return 'ho'
  }
  protected static final void combineMethod(){}
}

方法参数声明

class SomeClass{
  static method(arg){
      println 'untyped'
  }
  
  static method(String arg){
      println 'typed'
  }
  
  static method(arg1, Number arg2){
      println 'mixed'
  }
}

高级方法参数使用

class Summer{
  def sumWithDefaults(a,b,c = 0){
      return a + b + cs
  }
  
  def sumWithList(List args){
    return args.inject(0){
        sum,i ->
              sum += i
    }
  }
  
  def sumWithOptionals(a, b, object[] optionals){
      return a + b + sumWithList(optionals.toList())
  }
  
  def sumNamed(Map args){
    ['a','b','c'].each{
        args.get(it,0)
    }
    return args.a + args.b + args.c
  }
}

构造函数

位置参数

class VendorWithCtor {
    String name, product
    
    VendorWithCtor(name,product){
        this.name = name
        this.product = product
    }
}

def first = new VendorWithCtor('canoo','ULC') // Normal constructor use
def second = ['Canoo', 'ULC'] as VendorWithCtor // Coercion with as
VendorWithCtor third = ['Canoo', 'ULC'] // Corecion in assignment

命名参数

class Vendor{
    String name, product
}
new Vendor()
new Vendor(name: 'Canoo')
new Vendor(product: 'ULC')
new Vendor(name: 'Canoo', product: 'ULC')

def vendor = new Vendor(name: 'Canoo')
assert 'Canoo' == vendor.name

隐式构造函数

java.awt.Dimension area
area = [200,100]
assert area.width == 200
assert area.height == 100

属性获取设置器

class MyBean{
  def a
  def b
  
  def getA(){
    return a
  }
  
  def getB(){
    return b
  }
  
  def setA(a){
    this.a = a
  }
  
  def setB(b){
    this.b = b
  }
}

def mb = new MyBean()
mb.a = 10
mb.b = 30

属性获取方法,Groovy方式直接.属性名就可以了.

Java Groovy
getPropertyName propertyName
setPropertyName(value) propertyName = value

属性获取器和@语法的使用区别

class MrBean{
    String firstName, lastName
    String getName(){
        return "$firstName $lastName"
    }
}

def bean = new MrBean(firstName: 'Rowan')
bean.lastName = 'Atkinson'

//advanced accessors with groovy

class DoubleBean{
    public value //visible value
    
    void setValue(value){
        this.value = value  //inner field access
    }
    
    def getValue(){
        value * 2     //inner field access
    }
}

def bean2 = new DoubleBean(value: 100)
assert 200 == bean2.value   //Property access  use getter method
assert 100 == bean2.@value   // Outer field access  directly access

GPaths查询对象

invoke example for Gpath

class Book {
    String name
    List authors
}
class Author {
    String name
    Address addr
}
class Address {
    String province
    String city
}

def addr1 = new Address(province:'Guangdong',city:'Shenzhen')
def addr2 = new Address(province:'Gunagdong',city:'Guangzhou')
def addr3 = new Address(province:'Hunan',city:'Changsha')
def addr4 = new Address(province:'Hubei',city:'Wuhan')
def books = [new Book(name:'A glance at Java',authors:[new Author(name:'Tom',addr:addr1)]),
             new Book(name:'Deep into Groovy',authors:[new Author(name:'Tom',addr:addr1),new Author(name:'Mike',addr:addr3)]),
             new Book(name:'A compare of Struts and Grails',authors:[new Author(name:'Wallace',addr:addr4),new Author(name:'Bill',addr:addr2)]),
             new Book(name:'learning from Groovy to Grails',authors:[new Author(name:'Wallace',addr:addr3)])]

//目标是找到作者是"Tom"的书籍的书名
//Java风格
def booksOfTomOldWay = []
books.each {
    def book = it
    def aus = it.authors
    
    aus.each {
        au->
            if (au.name == 'Tom')
                booksOfTomOldWay << book.name
    &#125;
&#125;

println booksOfTomOldWay
//Groovy风格 非常简练,也符合一个正常的思考顺序.

def booksOfTom = books.grep&#123;
    it.authors.any&#123;
        it.name == 'Tom'
    &#125;
&#125;.name

println booksOfTom

空操作安全

Duck duck = new Duck()
duck?.eat() // ?.标识如果对象是一个空值,那么久不调用函数.只有非空对象才会执行函数的调用

Comments

2017-08-22

⬆︎TOP