版權(quán)聲明:本文由“勤勞的悄悄”翻譯,并發(fā)布在“簡書”網(wǎng)模孩,轉(zhuǎn)帖請保留該版權(quán)聲明。
本章內(nèi)容為 Groovy 程序結(jié)構(gòu)部分榨咐。
[TOC]
1. 定義包
</p>
包的定義和在 Java 中一樣:
// defining a package named com.yoursite
package com.yoursite
2.導(dǎo)入包
</p>
將包里的類名導(dǎo)入后就可以直接使用類名介却,而不用再加限定名
// importing the class MarkupBuilder
import groovy.xml.MarkupBuilder
// using the imported class to create an object
def xml = new MarkupBuilder()
assert xml != null
2.1.默認(rèn)導(dǎo)入
</p>
下面這些類在 Groovy 中已經(jīng)被默認(rèn)導(dǎo)入,可以直接使用
import java.lang.*
import java.util.*
import java.io.*
import java.net.*
import groovy.lang.*
import groovy.util.*
import java.math.BigInteger
import java.math.BigDecimal
2.2.常規(guī)導(dǎo)入
</p>
簡單導(dǎo)入就是常規(guī)導(dǎo)入
// importing the class MarkupBuilder
import groovy.xml.MarkupBuilder
// using the imported class to create an object
def xml = new MarkupBuilder()
assert xml != null
2.3.星號導(dǎo)入
</p>
星號導(dǎo)入可以一次性將包里的類全部導(dǎo)入
import groovy.xml.*
def markupBuilder = new MarkupBuilder()
assert markupBuilder != null
assert new StreamingMarkupBuilder() != null
星號導(dǎo)入的問題是块茁,導(dǎo)入的類名可能會和本地類名沖突
2.4.靜態(tài)導(dǎo)入
</p>
一般情況下齿坷,要使用類里面的靜態(tài)方法或者靜態(tài)屬性,都要加上類名作為限定数焊。
使用靜態(tài)導(dǎo)入后可以直接將類中的靜態(tài)方法和靜態(tài)屬性導(dǎo)入到名字空間中永淌,可以直接使用。
import static Boolean.FALSE
assert !FALSE //use directly, without Boolean prefix!
2.5.靜態(tài)導(dǎo)入別名
</p>
有時(shí)候靜態(tài)導(dǎo)入的方法名字并不直觀佩耳,可以用 as
給它起個(gè)別名
import static Calendar.getInstance as now
assert now().class == Calendar.getInstance().class
2.6.星號靜態(tài)導(dǎo)入
</p>
同樣可以利用星號將類中的所有靜態(tài)屬性和靜態(tài)方法一次性導(dǎo)入
import static java.lang.Math.*
assert sin(0) == 0.0
assert cos(0) == 1.0
2.7.給導(dǎo)入的類起別名
</p>
常規(guī)導(dǎo)入的類也可以起別名遂蛀,常用在下面的場景中。
下面有一個(gè)第三方的包干厚,其中MultiplyTwo
方法的意思是乘以2
李滴,但是代碼理卻錯(cuò)誤的乘以了3
package thirdpartylib
public class MultiplyTwo {
def static multiply(def value) {
return value * 3 //故意乘錯(cuò)數(shù)字
}
}
我們在很多地方像下面這樣使用了這個(gè)錯(cuò)誤方法
def result = new MultiplyTwo().multiply(2)
因?yàn)槭堑谌桨覀儫o法修改原始代碼蛮瞄。但是我們可以用類別名來解決這個(gè)問題:
- 給有錯(cuò)誤的類起個(gè)別名
- 自己定義一個(gè)和原先同名的類所坯,擴(kuò)展原來錯(cuò)誤的類
- 并修正其中錯(cuò)誤的方法
import thirdpartylib.MultiplyTwo as OrigMultiplyTwo
class MultiplyTwo extends OrigMultiplyTwo {
def multiply(def value) {
return value * 2 // fixed here
}
}
// nothing to change below here
def multiplylib = new MultiplyTwo()
// assert passes as well
assert 4 == new MultiplyTwo().multiply(2)
3.腳本 VS 類
</p>
3.1.主類 VS 腳本
</p>
Groovy 可以向 Java 一樣,用一個(gè)主類來啟動程序
Main.groovy
class Main {
static void main(String... args) {
println 'Groovy world!'
}
}
也可以直接運(yùn)行一個(gè)腳本
Main.groovy
println 'Groovy world!'
3.2.腳本類
</p>
腳本實(shí)際上總是被編譯成一個(gè)類挂捅,類名和腳本名相同芹助,代碼都放置在run
方法中
Main.groovy
import org.codehaus.groovy.runtime.InvokerHelper
class Main extends Script {
def run() {
println 'Groovy world!'
}
static void main(String[] args) {
InvokerHelper.runScript(Main, args)
}
}
3.3.方法
</p>
在腳本中可以定義方法
int fib(int n) {
n < 2 ? 1 : fib(n-1) + fib(n-2)
}
assert fib(10)==89
方法的調(diào)用和定義都可以放在腳本中
println 'Hello'
int power(int n) { 2**n }
println "2^6==${power(6)}"
腳本中的方法實(shí)際上是在腳本類中定義,而所有的執(zhí)行代碼都是放在run
方法中闲先。上面的代碼會被轉(zhuǎn)換成下面這樣:
import org.codehaus.groovy.runtime.InvokerHelper
class Main extends Script {
int power(int n) { 2** n}
def run() {
println 'Hello'
println "2^6==${power(6)}"
}
static void main(String[] args) {
InvokerHelper.runScript(Main, args)
}
}
3.4.變量
</p>
可以向 Java 中一樣状土,先聲明再使用:
int x = 1
int y = 2
assert x+y == 3
也可以直接使用一個(gè)沒有聲明的變量
x = 1
y = 2
assert x+y == 3
用第一種方法聲明的變量,不能在腳本中的方法中使用伺糠,在腳本外部也看不到蒙谓。
用第二種方法聲明的變量,可以在腳本中的方法中使用退盯,在腳本外部也可以看到。