• 0
  • 0
分享

简介

本文将介绍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 list
assert list.getClass() == org.codehaus.groovy.runtime.NullObject
assert list.is(null)

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

list = [1,2,4]
assert list instanceof ArrayList

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

int rate = 20
rate = [12] // GroovyCastException
rate = "nill" // GroovyCastException

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

def rate
assert rate == null
assert rate.getClass() == org.codehaus.groovy.runtime.NullObject

rate = 12
assert 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 BigDecimal
assert divide(1, 0) instanceof String

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

def greetMsg() {
    println "Have Fun ~ Tester !"
}

def与Type

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

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

def int count
assert 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来为其所有方法和属性启用类型检查:

@TypeChecked
class 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)

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 在我们测试接口提供的数据,支持的业务功能之前,我们非常有必要再提一下接口本身的规则,即便我们在前面的章节已经隐隐约约的提到过。1. 接口文档如果让我给接口文档下个定义,文档是使用接口的人对于接口的约束口头协定(对,你没看错,这是我最经常见的)word/Excel/txt 文件api管理平台(rap2/yapi等等)文档应该出现且不限于以下几点内容:接口访问的地址接口参数必须传的参数非必须传的参数指定数据类型参数请求方式GET请求POST请求返回字段的含义至于为什么是上面几条,不赘述,大家可以想一哈2. 遵循接口文档对于测试人员来讲,遵循接口文档,就是按照文档进行测试。测试也可以分为两种风格:懒...
            0 0 1303
            分享
          • 前言前几天在群里,有同学问了一个自动化测试实践中遇到的问题:持续集成的自动化用例很多,测试环境日志level为debug,日志量大概40G/每天,定位问题时日志查询很慢,该怎么解决?这个问题可以说是自动化测试实践中经常遇到的问题,那么该如何解决这些问题呢?或者说有没有更好的方案来优化这些问题?这篇文章,我想聊聊我的看法。日志作用在聊日志处理之前,先来看看日志的作用。日志的本质就是记录系统各种操作事件的记录信息。它记录了系统的各项特征,类似医院体检后的体检报告。它反映了系统的健康状态、各项操作事件、系统变更情况以及各种异常隐患。日志是技术人员处理工作很重要的一个辅助工具和手段,运维同学可以及时的...
            0 0 1432
            分享
          • 凡事了解一些性能测试的工程师,都知道要做好性能测试除了要会使用性能测试工具编写性能测试脚本外,更重要的两项工作是性能测试执行后,到底是否存在性能故障?以及存在性能故障的原因存在于何处?是网络原因、数据库原因、算法原因、硬件设备原因亦或是架构设计等等其他原因造成的呢?即使定位了性能故障,接下来如何对系统性能进行调优,使其满足用户的需求,这又是一大难点工作......而今天想和大家交流的是性能测试中最最有价值又最最容易被忽略的事情—性能需求及风险分析!我们先看一张图,下图是软件缺陷的修复费用示意图,大家一定都不陌生。从这张图中我们可以清楚的看出在后期bug修复的成本可能比需求阶段高出1000倍。那...
            1 2 1745
            分享
          •   摘要:作者在新项目中搭建了python+requests+unittest+HTMLTestRunner接口自动化测试框架,通过修改配置文件实现环境隔离,一份脚本即可在不同的环境执行接口测试用例。  但是没有实现任何形式的消息通知,也没有集成到jenkins,原因很简单,因为还没做到很大,而且用户活跃不够,问题也相对较少,只在上线前后执行一次uat和prod环境。  那这几天想完善一下消息通知功能,让它具备发送消息及报告的功能。  流程  代码  流程及代码功能已在注释中说明。  '''   Created on 2021年5月12日   @au...
            0 0 1218
            分享
          •   智能穿戴设备是目前已经渐渐融入到日常生活中的一种随身设备了,适用人群和本身功能在不断提升,而且也是目前市场上比较流行的产品需要。各种智能穿戴设备如雨后春笋一般层出不穷。  智能手环作为一种轻量级穿戴设备,外观时尚运动,这种设计风格对于习惯佩戴首饰的用户而言,颇具诱惑力。并同时具备了手表、运动监测和健康监测等诸多功能的智能设备,越来越受到广大用户的青睐,同时在市场上也进入了竞争的白热化阶段,逐渐形成了自己的升级更新路径。  智能手环因为不具备安装应用等功能,严格来说是不能称之为智能设备的,但是因为业界对于同样特质的智能手表给予了“智能”的名号,所以智能手环也就搭了顺车,被冠以智能设备的名号。...
            13 13 2884
            分享
      • 51testing软件测试圈微信