• 0
  • 0
分享

在之前的文章和视频中,我分享过Groovy语法中def关键字的基本使用方法。当时对def理解是:不定类型变量,资料中也有说是无类型变量,感觉两个意思大差不差,就是不显式声明对象类型。

基本使用方式如下:

def a = 1
def b = "FunTester"

类似这样的方式,当时Java新版也已经支持了var可以替代一些显式声明变量类型的代码,但是除了使用范围上,Groovy的def还是明显优于var,而且功能上也是强不少(当然有人理解为弱不少,后续讲解)。

本质区别在于Groovy的def不仅可以替代显式的类型声明,还可以使用其他类型对象进行赋值,而改变def实际代表的类型。例如:


def  a = 1
a = "FunTester"

这在Java代码中是会报错的,但是在Groovy中就不会。Groovy也有类型推断,这一点Intellij也有相关支持(如果没有,请升级)。

这就牵扯出我今天要分享的我的理解,def是可变类型。能够通过赋值,重新设置对象的实际类型。

有什么用呢?

其实可以减少代码量。下面举个例子,有个需求要把一堆字符串(JSON格式),转成一个Map或者JSON,其中value值(也是JSON格式)对象转成对象。

举例说明:

我们有一个Demo对象:

    private static class Demo {

        Demo(int age, String name) {
            this.age = age
            this.name = name
        }
        int age

        String name

        @Override
        public String toString() {
            return "Demo{" +
                    "age=" + age +
                    ", name='" + name + '\'' +
                    '}';
        }
    }

字符串内容如下:

{"a":{"age":1,"name":"FunTester123"},"b":{"age":2,"name":"FunTester123"},"c":{"age":3,"name":"FunTester123"}}

下面是我的代码:

 def config = JSON.parseObject(str).each {it.value = new Demo(it.value.age, it.value.name)}
 output(config.a)

下面是控制台输出:

22:48:18.367 main Demo{age=1, name='FunTester123'}

说明config对象的value值已经转成了Demo。第一行代码中,config的类型由Intellij推断出来还是Map<String, Object>,但是在代码执行过程中依然变成了Map<String, Demo>。

如果是为了后面调用Demo对象方便(Intellij),可以在第一行末尾加上 as Map<String, Demo>,这样Intellij就会认为config类型是 as Map<String, Demo>。

PS:def还可以作为方法返回值,这样就可以实现一个方法返回不同类型的对象。

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

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   软件测试是用来验证软件解决方案或产品是否符合要求和期望的过程。软件测试的旨在发现缺陷,并证明软件是适合使用的。有许多测试方法、类型和技术可用于验证功能和非功能需求。  测试自动化是使用其他软件来自动化手动测试或在应用程序中执行手动用户操作的过程。在手动测试不可能或费时的情况下,用其他软件的帮助来验证软件是一个好主意。  自动化测试是使用专门的软件工具验证软件解决方案,通常涉及自动化功能作为测试过程的一部分。  自动化测试是使用特殊的软件,与被测试的软件分开,来控制和执行测试,包括实际结果与预测结果的比较和报告。应用程序被称为被测应用程序(AUT the application under ...
            0 0 743
            分享
          •   在真实的压测过程中,我们不可能是录制完脚本直接就设置虚拟用户进行压测,通常为了使压测结果更加真实,我们还需要做一些修改,其中就用到了逻辑控制器,下面具体来讲一下几种常用的逻辑控制器的使用。  Loop Controller(循环控制器)  使用场景:如果录制的一个脚本中,我只想对其中的一个或者几个请求进行循环操作,但是登录请求只想执行一次,那么应该怎么办?  添加循环控制器即Loop Controller:  在这里设置Controller里请求的循环次数:  这样我们在执行脚本的时候,该循环控制器下面的所有请求都会请求两遍,而登录操作只会执行一遍,执行结果如下:  While Contr...
            14 14 1828
            分享
          •   在日常的测试工作中,其中最重要的一步就是编写测试用例,那么我们如果编写一份高质量的测试用例的?选对编写测试用例的方法很重要。针对不同功能我们要选择合适的方法。比如说一个注册页面,我们该怎样设计测试用例呢?  针对这种有较多输入框且长度有限制的功能模块,我们一般采用等价类划分和边界值分析法来设计测试用例。  等价类划分  等价类划分是将所有的输入条件分为若干等价类,然后从所有等价类中抽取其中有代表意义的数据进行测试的方法。  ·有效等价类:对程序来说合理的、有意义的输入  ·无效等价类:对程序来说无效的输入  这里我们假设:  ·用户名的限制是8-16位数字和大小写字母的组合  ·手机号的限...
            11 11 2381
            分享
          • 读者提问:APP 登录功能,用例怎么写 ?阿常回答:假定该登录为手机号密码的登录方式,登录界面存在 2个输入框(手机号,密码), 1个登录按钮。一、正常登录流程正常登录流程 case前置条件    应用安装成功,网络连接正常    输入数据    手机号:18957440009密码 :Aa123456测试步骤1、输入手机号2、输入密码3、点击登录按钮预期结果1、输入成功2、输入成功3、登录成功,跳转首页二、异常登录流程手机号异常校验前置条件    应用安装成功,网络连接正常   &nb...
            0 0 2807
            分享
          • 蓦然回首自己做IT这个行业已经十年了,这十年中我获得了很多,技术能力、培训、出国、大公司的经历,还有很多很好的朋友。但再仔细一想,这十年中我至少浪费了五年时间,这五年可以足够让自己成长为一个优秀的程序员,可惜我错过了,我用这五年时间和很多程序员一样在困惑和迷茫中找不到出路!路其实一直都在那里,只是我们看不到而已!以前我一直被公司和技术牵着走,并不是自己在选择技术,而是不自觉地被推到了这个位置上。想想有多少人对于自己将来要从事的职业和技术类型进行过深入思考和比较呢?当我跳出编码后,我开始思考和程序及程序员职业生涯相关的问题,最后发现,影响我们走入今天的困局的竟然是一些我们常常挂在嘴边的话(观念)...
            0 2 3055
            分享
      • 51testing软件测试圈微信