写点什么

Groovy 关键字 def

作者:FunTester
  • 2023-03-28
    北京
  • 本文字数:1687 字

    阅读完需:约 6 分钟

简介

本文将介绍 Groovy 中 def 关键字。它为这种动态 JVM 语言提供了可选的类型化功能。

def 关键字的含义

def 关键字用于在 Groovy 中定义无类型变量或函数,因为它是一种可选类型的语言。


当我们不确定变量或字段的类型时,我们可以利用 def 让 Groovy 在运行时根据分配的值决定类型:


def a = "FunTester"  def b = ['A', 'B', 'C', 'D']
复制代码


在这里,a 将是一个 String,而 b 将是一个 ArrayList。


我们还可以使用 def 关键字来定义方法的返回类型:


def plus(x, y) {    return x + y}
复制代码


在这里,plus 可以返回任何类型的对象,这取决于我们传递给它的参数。


因为 Groovy 可以重载操作符 + ,让对象也可以使用 +

def 变量

让我们了解 def 如何处理变量。


当我们使用 def 声明变量时,Groovy 将其声明为 NullObject 并为其分配空值:


def listassert list.getClass() == org.codehaus.groovy.runtime.NullObjectassert list.is(null)
复制代码


当我们为列表赋值时,Groovy 会根据赋值定义它的类型:


list = [1,2,4]assert list instanceof ArrayList
复制代码


假设我们想让我们的变量类型动态化并随着赋值而改变:


int rate = 20rate = [12] // GroovyCastExceptionrate = "nill" // GroovyCastException
复制代码


我们不能将 List 或 String 分配给 int 类型的变量。为了克服这个问题并调用 Groovy 的动态特性,我们将使用 def 关键字:


def rateassert rate == nullassert rate.getClass() == org.codehaus.groovy.runtime.NullObject
rate = 12assert rate instanceof Integer rate = "Not Available"assert rate instanceof String rate = [1, 4]assert rate instanceof List
复制代码

def 方法

def 关键字进一步用于定义方法的动态返回类型。当我们可以为一个方法提供不同类型的返回值时,使用 Groovy def 很方便:


def divide(int x, int y) {    if (y == 0) {        return "被除数不能为 0"    } else {        return x/y    }}
assert divide(12, 3) instanceof BigDecimalassert divide(1, 0) instanceof String
复制代码


我们还可以使用 def 来定义一个没有显式返回的方法:


def greetMsg() {    println "Have Fun ~ Tester !"}
复制代码

def 与 Type

让我们讨论一些围绕使用 def 的最佳实践。


虽然我们可以在声明变量时同时使用 def 和 type:


def int countassert count instanceof Integer
复制代码


def 关键字在那里是多余的,所以我们应该使用 def 或具体的类型。此外我们应该尽量避免方法参数中使用 def 关键字。虽然这有时候用起来很爽,很高效,但是埋下的坑总归是要还的。


不适合的示范:


void multiply(def x, def y)


最佳示范:


void multiply(x, y)


此外,我们应该避免在构造函数时使用 def。

Groovy def 与 Java Object

由于我们已经了解了 def 关键字的大部分功能及其用法,可能大多数人都在会问:它是否类似于在 Java 中使用 Object 类声明某些内容。def 可以被认为类似于 Object:


def fullName = "Norman Lewis"


同样,我们可以在 Java 中使用 Object :


Object fullName = "Norman Lewis";

def 与 @TypeChecked

如果你是一个 Java 技术栈选手,你可能想知道如何在 Groovy 中强制进行编译时类型检查。我们可以使用@TypeChecked注释轻松实现这一点。


例如,我们可以在一个类上使用 @TypeChecked 来为其所有方法和属性启用类型检查:


@TypeCheckedclass FunTester extends GroovyTestCase {
def multiply(x, y) { return x * y } int divide(int x, int y) { return x / y }}
复制代码


在这里,FunTester 类将被类型检查,编译代码时将会报错:


[Static type checking] - Cannot find matching method java.lang.Object#multiply(java.lang.Object). Please check if the declared type is correct and if the method exists.


如果你想要忽略一个方法,我们可以使用 TypeCheckingMode.SKIP:


@TypeChecked(TypeCheckingMode.SKIP)def multiply(x, y)
复制代码


发布于: 刚刚阅读数: 3
用户头像

FunTester

关注

公众号:FunTester,800篇原创,欢迎关注 2020-10-20 加入

Fun·BUG挖掘机·性能征服者·头顶锅盖·Tester

评论

发布
暂无评论
Groovy关键字def_FunTester_InfoQ写作社区