首页 > 其他分享 >Groovy关键字def

Groovy关键字def

时间:2023-03-28 19:07:16浏览次数:32  
标签:Groovy int assert 关键字 rate def

简介

本文将介绍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)

标签:Groovy,int,assert,关键字,rate,def
From: https://blog.51cto.com/FunTester/6155227

相关文章

  • Educational Codeforces Round 77 (Rated for Div2)
    B-ObtainTwoZeroes给定两个整数\(a,b\),你可以执行以下操作任意次:每次操作选择一个正整数\(x\),使得\(a:=a-x,b:=b-2x\)或者\(a:=a-2x,b:=b-x\),问你是否能通过操作使......
  • 用Groovy思考 第三章 Groovy开发环境
    用Groovy思考第三章Groovy开发环境作者:chszs本章将继续深入Groovy语言,首先学习Groovy脚本,包括从命令行编译和运行Groovy脚本,GroovyShell,和GroovyConsole。你将学会使用G......
  • 用Groovy思考 第四章 Groovy特性深入
    用Groovy思考第四章Groovy特性深入作者:chszs1.断言Java开发者常常使用JUnit或TestNG做单元测试,所以对断言是很清楚的。断言是用于验证假设的条件是否为真。在Groovy的断......
  • 用Groovy思考 第一章 用Groovy简化Java代码
    用Groovy思考 第一章用Groovy简化Java代码作者:chszs1.Groovy的安装目前Groovy的最新版本为2.1.2版,下载地址为:http://groovy.codehaus.org/Download下载后解压groovy-bin......
  • /etc目录下passwd shadow group gshadow 四个文件中每个字段的含意以及etc目录下login
    1./etc/passwdroot@root:~#cat/etc/passwdroot:x:0:0:root:/root:/bin/bashdaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologinbin:x:2:2:bin:/bin:/usr/sbin/nologi......
  • C#: dynamic 关键字
    C#dynamic关键字是C#语言中的一个关键字,它允许在运行时动态地确定变量的类型。这意味着可以在编译时不确定变量的类型,而是在运行时根据需要确定变量的类型。这种灵活性......
  • require is not defined
    这个问题是因为:你需要用到echarts/echarts.js这个js文件,而你没有导入,所以才会报错<scripttype="text/javascript"charset="utf-8"src="echarts/echarts.js"></script......
  • Go 语言 new 和 make 关键字的区别
    原文链接:Go语言new和make关键字的区别本篇文章来介绍一道非常常见的面试题,到底有多常见呢?可能很多面试的开场白就是由此开始的。那就是new和make这两个内置函数......
  • cmake编译报错 undefined reference to `xxx'
    错误信息:F:/github/Demos/br_cmake_proj/Demos/CmakeProject2/main.cpp:11:undefinedreferenceto`Module1A::Module1A()'代码目录结构相关代码片段错误根因:模块......
  • ubuntu gurobi link error undefined reference
    linkerrorundefinedreferenceto`GRBModel::addVar(double,double,double,char,std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char>>......