groovy簡明教程(六)対象者向け

6064 ワード

8.groovyの対象
groovyはjavaから来ました。もちろん対象に向かう遺伝子が含まれています。
8.1属性とローカル変数
groovyにはprvate、protected、publicなどのアクセスがありますが、groovy 2.0.7テストの結果、これらの修繕符は機能していません。publicのアクセス権限です。これはバグのようですが、まだ修復されていません。http://jira.codehaus.org/browse/GROOVY-1875
また、groovy beanはgetter/setterを生成します。もちろんsetをカバーすることもできます。オペレータをポイントして呼び出すこともできます。また、「propertyName」を通じて動的にアクセスすることもできます。
package org.jamee.hello.groovy.bean

class BeanAccessor {
	def dftField;
	private priField;
	protected protField;
	def AnotherBean ab;
}

package org.jamee.hello.groovy.bean

class AnotherBean {
	def name;

	void setName(def name) {
		this.name = 'in setName ' + name;
	}
}

package org.jamee.hello.groovy.main

import org.jamee.hello.groovy.bean.AnotherBean;
import org.jamee.hello.groovy.bean.BeanAccessor;

class GroovyTester {
	static main(args) {
		def ba = new BeanAccessor()
		ba.dftField = 'default value'
		ba.priField = 'private value'
		println ba.dftField
		println ba['dftField']
		println ba.priField
		ba.ab = new AnotherBean()
		ba.ab.name = 'ab\'s name'
		println ba.ab.name;
		ba.protField = 'protected value'
		println ba['protField']
	}
}
 出力:
書き記す
default value
default value
prvate value
in set Name ab's name
protected value
 
8.2デフォルトのパラメータ、変長パラメータと命名パラメータ
groovyは他のスクリプト言語の特性を借りて、デフォルトパラメータとネーミングパラメータをサポートします。
 
class Greety {
    def sayHello(person, message="good day") {
        return "Hi, $person, $message"
    }
    def sayHellos(message, person, Object[] persons) { // like def SayHellos(message, person, ...otherPersons)
        return persons.inject(message +" $person,") {words, i -> words += " $i,"}
    }
    def sayHello(Map namedParams) {
        return "${namedParams.message}, ${namedParams.person}"
    }
}

def greety = new Greety()
println greety.sayHello('jhone') // output: Hi, jhone, good day
println greety.sayHello('allen', 'how are you') // output: Hi, allen, how are you
println greety.sayHellos('good day', 'bill', 'clark', 'danny') // called like var args, output:good day bill, clark, danny,
println greety.sayHello(message:'good day', person:'eval') // output:  good day, eval
 8.3メソッド呼び出し
groovyの呼び出し方法は、文字列または文字列変数として、より便利にjavaの反射を使用することができる。
また、頭痛のあるNull PointerExceptionに対して、より便利な検査方法を提供します。
class Foo {
    def callme() {
        return 'foo called'
    }
}

def foo = new Foo()
println foo.callme() // output: foo called
println foo.'callme'() // output: foo called
def mn = 'callme'
println foo."$mn"() // output: foo called

def map = [a:[b:[c:1]]]

println map.a.b.c
// println map.a.x.c // NPE throw
println map?.a?.x?.c // protected
 8.4コンストラクタ
groovyは、Javaの従来の方式、as変換構造、および暗黙的構造の3つの構成例を提供する。
また、groovyはコンストラクションのためにネーミングパラメータを提供しています。このように属性の多い種類に対して使いやすいです。javaのbuilderモードを覚えています。groovyは生まれつきサポートしています。
class Name {
    def firstName;
    def lastName;

    Name(firstName, lastName) {
        this.firstName = firstName
        this.lastName = lastName
    }

    def String toString() {
        return this.firstName + ' ' + this.lastName
    }
}

def n0 = new Name('alex', 'bell')
def n1 = ['bob','jons'] as Name
assert n1 instanceof Name
Name n2 = ['clark', 'lee']
assert n2 instanceof Name

class Person {
    Name name
    def age
    def gender
    def email
}

new Person()
p1 = new Person(name : n0)
println p1.name // output: alex bell
p2 = new Person(name : n1, email : '[email protected]')
println p2.email // output: [email protected]
8.5種類、バッグ
groovyはjavaのもう一つの表現形式であり、どのgroovyの脚本もクラスにコンパイルされています。シナリオにはclassが含まれていない場合、groovyはデフォルトでシナリオ全体を一つのカテゴリーにコンパイルし、mainメソッドを追加します。
groovyのパッケージの形態はjavaと同じですが、groovyは期待していた特性を提供しています。クラスに別名を引用して、Cのtypedefに似ています。このように一つのクラスで同じ名前のclassを引用すると、長いパッケージ名を書く必要がなくなります。
import com.company.util.StringUtil
import com.myCompany.util.StringUtil as MyStringUtil
8.6 GPath、Spread、Use
GPath
属性の短いアクセス方法で呼び出すことができます。例えば、コードをよりコンパクトにします。
invoices.items.grep{ it.total() > 7000 }.product.name
 対応するJavaコード:
private static List getProductNamesWithItemTotal(Invoice[] 
invoices) { 
	List result = new LinkedList(); 
	for (int i = 0; i < invoices.length; i++) { 
		List items = invoices[i].getItems(); 
		for (Iterator iter = items.iterator(); iter.hasNext();) { 
			LineItem lineItem = (LineItem) iter.next(); 
			if (lineItem.total() > 7000){ 
				result.add(lineItem.getProduct().getName()); 
			} 
		} 
	} 
	return result; 
}
Spread操作符(*)
呼び出しを容易にするためにあなたのセットを展開することができます。pythonも同様の操作を提供します。
list = [1,2,3]
range = 1..3

def connect(x, y, z) {
    return x + y + z
}

assert 6 == connect(*list)
assert 6 == connect(*range)
Use操作子
class StringCaculationCategory {
    static String plus(String first, String second) {
        Integer.parseInt(first) + Integer.parseInt(second)
    }
}

use(StringCaculationCategory) {
    println '1' + '2'
}