• 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.应往届理工科毕业生,有志于在IT行业发展。  2.计算机相关专业;  3.有计算机语言者优先,如:C语言、C++、Java、.Net等。  初级测试工程师  任职要求:  1.一年以上软件测试经验,熟悉各种测试方法、测试工具、测试流程;  2.本科及以上学历,计算机相关专业;  3.有较强的分析问题能力和文字表达能力,逆向思维好;能完成测试方案、测试案例、测试报告的编写;  4.热爱软件测试工作,可以胜任重复性工作;  5.具有较强的沟通理解能力和协调能力,对工作积极主动、认真负责;  中级测试工程师  任职要求:  1.三年以上软件测试工作经验;  2...
            0 0 3582
            分享
          • 基本技术问题:游戏测试的基本流程:分析测试需求-制定测试计划-设计测试用例-(可能会进行冒烟测试)-执行测试-生成测试报告OSI七层协议:应用层-表示层-会话层-传输层-网络层-数据链路层-物理层TCP与UDP的差别:游戏测试与软件测试之间的关系:1、游戏测试是软件测试的一部分游戏测试简单说就是发现游戏里的问题(BUG)并进行改进,从而提升游戏产品的质量。游戏测试作为软件测试的一部分,它具备了软件测试所有的一切共同的特性:①测试的目的是发现软件中存在的缺陷。②测试都是需要测试人员按照产品行为描述来实施。产品行为描述可以是书面的规格说明书,需求文档,产品文件,或是用户手册,源代码,或是工作的可执...
            3 3 1883
            分享
          • 当前的风气是,谈测试,必言“接口”。其实接口并不神秘,当今的应用中无处不是“接口”,从本篇开始让我来谈一些关于接口的浅薄认识。1、一个简单的接口(demo.php)<?php     // 文件名称demo.php     // 告诉浏览器返回为json类型     header('Content-Type:application/json; charset=utf-8');     ...
            3 4 1986
            分享
          • 作为一个合格的测试工程师,必须掌握测试的日常工作流程。那么在一个产品周期里面,测试工程师是什么时候介入工作的呢?具体承担了哪些工作呢?这两问题,也是在日常面试中经常遇到的,这里我用一张思维导图进行简单的概括(如下图)今天我们就来说说“测试用例设计”和“测试用例评审”。测试用例设计常见的测试用例方法大家都在网上和日常测试过程中都有用到过。这里给大家讲解一些特殊的测试点该如何进行用例设计。详情页字段校验方法:场景组合设计用例实现:同一个详情页不同字段,通过场景组合用例设计,可实现在“同一条测试数据”的基础上,校验“不同字段,不同枚举值”,节约测试工作量。通过上面这个场景,实现在“同一条测试数据”的...
            0 0 2246
            分享
          •   什么是数据管理?  女士们,先生们,欢迎来到数据管理的世界——数字球美女,商业机器背后的驱动力。简而言之,数据管理是收集、保护和利用数据的做法,这些策略安全、高效且具有成本效益。想象一下,有一个数字图书管理员,但不是严厉的喝斥,而是让你毫不费力地访问数据。无论你的组织规模如何,这个魔法都会创造奇迹。  数据管理的组成部分  数据管理不单单是几个字符,它是一个由多个组件组成的合奏,演奏着一首美丽的交响乐。首先,我们有数据管理指挥家设定节奏,定义规则,并确保数据管理工作在法律允许范围内。接下来是数据质量,这是一个精致的女高音,确保数据是准确的,有关联的,最重要的是可用的。  接着是数据整合,我...
            0 0 484
            分享
      • 51testing软件测试圈微信