Groovy 程序结构


Groovy 程序结构

本篇是程序结构的阅读笔记。

1.包名

包名和Java相同

2.Import

2.1.默认导入

Groovy默认导入了

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.简单导入

全限定名导入类

2.3.星号导入

import groovy.xml.*

def markupBuilder = new MarkupBuilder()

assert markupBuilder != null

assert new StreamingMarkupBuilder() != null

2.4.静态导入

Groovy允许静态导入类并且与导入方法同名的方法,只要类型不同:

import static java.lang.String.format

class SomeClass {

    String format(Integer i) {
        i.toString()
    }

    static void main(String[] args) {
        assert format('String') == 'String'
        assert new SomeClass().format(Integer.valueOf(1)) == '1'
    }
}

如果具有相同的类型,以导入的类优先。

2.5.静态导入别名

import static Calendar.getInstance as now

assert now().class == Calendar.getInstance().class

2.6.静态星号导入

import static java.lang.Math.*

assert sin(0) == 0.0
assert cos(0) == 1.0

2.7.导入别名

import java.util.Date
import java.sql.Date as SQLDate

Date utilDate = new Date(1000L)
SQLDate sqlDate = new SQLDate(1000L)

assert utilDate instanceof java.util.Date
assert sqlDate instanceof java.sql.Date

3.脚本与类

3.1. public static void main 和 脚本

Groovy的类形式:

class Main {
    static void main(String... args) {
        println 'Groovy world!'
    }
}

Groovy的脚本形式:

println 'Groovy world!'

脚本无需定义一个类来执行

3.2.脚本类

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.方法

脚本中可以定义方法。

3.4.变量

脚本中得变量不需要定义类型,因此:

int x = 1
int y = 2
assert x+y == 3

x = 1
y = 2
assert x+y == 3

是一样的。

但是两者直接还是存在一定得差异

  • 在第一种写法中,参数将被定义为局部变量,并且在run方法之外不可访问。

    public Object run() {
        CallSite[] var1 = $getCallSiteArray();
        int x = 1;
    
        int y = 2;
        return BytecodeInterface8.isOrigInt() && !__$stMC && !BytecodeInterface8.disabledStandardMetaClass() ? var1[3].callCurrent(this, x + y) : var1[1].callCurrent(this, var1[2].call(Integer.valueOf(x), Integer.valueOf(y)));
    }

    以上是第一种写法的脚本中的run方法,可以看到xy被定义成了方法中的变量。

  • 在第二种写法中,参数被定义成脚本的属性,在脚本类中都可以访问到。

        public Object run() {
        CallSite[] var1 = $getCallSiteArray();
        byte var2 = 1;
        ScriptBytecodeAdapter.setGroovyObjectProperty(Integer.valueOf(var2), Five.class, this, (String)"x");
        byte var3 = 2;
        ScriptBytecodeAdapter.setGroovyObjectProperty(Integer.valueOf(var3), Five.class, this, (String)"y");
        return var1[1].callCurrent(this, var1[2].call(var1[3].callGroovyObjectGetProperty(this), var1[4].callGroovyObjectGetProperty(this)));
    }

文章作者: suifeng
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 suifeng !
  目录