13. Groovy 语言结构-包名,imports导入知识学习

2022-12-07 18:31:50 浏览数 (1)

1. 介绍

Groovy学习的第13篇内容。从本篇开始,学习Groovy的语言结构知识。想了解和使用一门语言,对于该语言的语法,关键字等知识了解后。

就需要了解语言结构了,知道怎么写的代码是规范的。怎么定义项目名称,导入外部依赖等等知识。

如果有其他语言的一些基础打底,本篇的相关知识可以很容易理解。

2. 包名-Package Names

在Groovy中定义包名和包名所产生的作用和Java中是完全相同的。Groovy并没有自己的特殊的包名定义规则。

定义包名可以允许我们在没有任何冲突的情况下高效分离各种代码库。Groovy类必须在类定义之前,指定其包。否则将会定义为默认包。

例如:

代码语言:javascript复制
package com.zinyan.demo

class Zinyan{

}

我们创建包名的原因有部分因素就是为了方便互相imports导入我们的其他类对象。系统的类存储在固定的包名路径下了。

我们的Groovy代码,如果写了多个模块。多个类之中。那么我们就应该通过包名将它进行分割。

而分割之后,互相之间要引用。那么就可以通过包名 类名。进行相对路径的引用了。

PS:通常我们在各种插件工具中,使用Groovy添加脚本时,脚本不用谢package定义包名。

3. Imports 导入

在Groovy中,引用其他路径下的类。也是通过关键字:import进行导入的。例如专属于Groovy中定义的MarkupBuilder类。我们如果要想使用它,就需要在类中添加导入信息:

代码语言:javascript复制
import groovy.xml.MarkupBuilder

例如我们完整使用的效果:

代码语言:javascript复制
package com.zinyan.demo

import groovy.xml.MarkupBuilder
class Zinyan{

    def static main(def args) {
        def temp = new MarkupBuilder()
        println(temp)
    }
}

3.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

我们如果要用的外部类是在上面这些包路径下,那么我们可以省略import的导入。

Groovy这样做是因为这些包中的类是最常用的。我们可以不用关注它们的导入,减少导入样板代码量。

3.2 基本导入

我们上面的示例中展示了导入效果。我们如果想使用某个不在同一目录下的外部类。

那么通过 import 包名 类名 的样式就可以导入了,这种导入方式只是导入了该指定的类。如果是这个包路径的全部类,甚至包括子路径里面的类。

那么可以使用上面默认示例中的*号,直接导入全部就可以了。

示例:

代码语言:javascript复制
//第一种 基本导入方式
import groovy.xml.MarkupBuilder
import groovy.xml.StreamingMarkupBuilder

//第二种 通配符导入方式
import groovy.xml.*

这两种导入之后。我们在下面的代码中都可以使用MarkupBuilderStreamingMarkupBuilder类。

这两者之间,在程序初始化等编译效率上是有些差异的。在实际使用中,大家更多的使用第一种基本导入方式。

因为这个可以直观的了解到,我们下面的代码都依赖了哪些关键类。

3.3 静态导入 static关键字

我们在导入类的时候,也可以导入属性。例如定义为static对象。我们可以通过import static 进行导入。示例如下:

代码语言:javascript复制
import static Boolean.FALSE

println(FALSE)  //输出false

这类似于Java的静态导入功能,但比Java更动态,因为它允许您定义与导入方法同名的方法,只要您有不同的类型。示例如下:

代码语言:javascript复制
import static java.lang.String.format 

class ZinyanDemo {

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

    def static main(def args) {
        //我们可以直接使用 static 静态导入的format方法
        println(format('zinyan')) //输出 zinyan
        //我们也可以使用自定义类中的方法
        println(new ZinyanDemo().format(1024)) //输出 1024
    }
}

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

在静态导入下,我们添加*号后与常规星形导入非常相似。区别在于它将从给定类导入所有静态方法。

例如,假设我们需要为应用程序计算正弦和余弦。类java.lang.Path具有名为sincos的静态方法,符合我们的需要。借助静态星形导入,示例如下:

代码语言:javascript复制
import static java.lang.Math.*
//我的类中没有sin 和cos方法,以下方法通过import static 导入的Math类中的静态方法
println(sin(90)) //输出:0.8939966636005579
println(cos(45)) //输出:0.5253219888177297

3.4 别名导入

我们如果导入的类和已有的类冲突了,可以通过 as 进行命名。在第11篇,运算符学习中介绍过as关键字。它可以用于类型强制转换。

而我们在import导入外部类时,可以用该关键字进行命名。之后就可以用新命名的名称引用该类了。示例如下:

代码语言:javascript复制
import static java.lang.String.format  as zinyan

def static main(def args) {
    println(zinyan('https://zinyan.com')) //输出 https://zinyan.com
}

上面的是静态导入,可以导入方法和类。我们如果不使用static关键字,也可以使用as进行别名的。示例如下:

代码语言:javascript复制
//例如两个相同的Date类,分别在不同的包下。
import java.util.Date 
import java.sql.Date as SQLDate  //我们将sql.Date 别名为SQLDate

//使用
Date utilDate = new Date(1000L)
SQLDate sqlDate = new SQLDate(1000L)


println(utilDate.getClass().getName())  //输出:java.util.Date
println(sqlDate.getClass().getName())  //输出:java.sql.Date

4. 小结

本篇介绍的内容比较基础,总的来说就是Groovy导入的方式和java中可以说是一样的。而唯一需要注意的就是Groovy中为每个类默认导入的一些工具类。

我们在实际使用中可以免于那些类的import

相关知识参考Groovy官网文档:http://docs.groovy-lang.org/docs/groovy-4.0.6/html/documentation/#_package_names

0 人点赞