「原创声明:保留所有权利,禁止转载」
Java
中null
和Groovy
中null
的一些明显差异。 首先看一下 Demo:
Object o = null
该语句在Java
和Groovy
中工作正常(Java
在行尾需要分号)。但是,其效果略有不同。
在Java
中,null
是一种特殊对象,它被分配给不指向任何对象的引用类型。每次尝试对null
引用执行任何操作(例如调用方法或访问成员变量)时,都会引发NullPointerException
。
在Groovy
中,null
是一个对象!它是org.codehaus.groovy.runtime.NullObject
的实例。大多数情况下,NullObject
将抛出NullPointerException
。但是,可以在NullObject
上调用一些方法:
import org.codehaus.groovy.runtime.NullObject
output NullObject == null.getClass()
output true == null.equals(null)
output false == null.asBoolean()
output "null!" == null + "!"
output false == null.iterator().hasNext()
控制台输出:
INFO-> 当前用户:fv,IP:192.168.0.104,工作目录:/Users/fv/Documents/workspace/fun/,系统编码格式:UTF-8,系统Mac OS X版本:10.15.4
INFO-> true
INFO-> true
INFO-> true
INFO-> true
INFO-> true
如我们所见,在某些情况下null
对象可以保护开发人员免受NullPointerExceptions
的侵害。asBoolean()
始终返回false
,并确保在必要时可以将 null 转换为布尔值。iterator()
返回java.util.Collections $ EmptyIterator
的实例。因此,可以安全地遍历对象而无需显式检查null
。
有趣的是,在正式的常规文档中我还没有找到有关NullObject
的任何信息。它不是在提到从 Java 的差异也不是Groovy
的空对象模式。可能没有实际的用例,甚至可以创建自己的NullObject
实例:
Class c = null.getClass()
NullObject myNull = c.newInstance()
但是请注意,如果传入默认的NullObject
实例,则equals()
方法仅返回true
。因此对于您自己的NullObject
实例,它可能会出错:
output myNull.equals(myNull)
output myNull.equals(null)
控制台输出:
INFO-> false
INFO-> true
您还可以通过修改metaClass
的NullObject
添加自定义的方法:
NullObject.metaClass.test = {output(getMark())}
null.test()
控制台输出:
INFO-> 1586415029
- 郑重声明:“FunTester” 首发,欢迎关注交流,禁止第三方转载。
技术类文章精选
- Linux 性能监控软件 netdata 中文汉化版
- 图解 HTTP 脑图
- 性能测试中图形化输出测试数据
- JMeter 吞吐量误差分析
- 多项目登录互踢测试用例
- 从 Java 到 Groovy 的八级进化论
- JMeter 如何模拟不同的网络速度
- 6 个重要的 JVM 性能参数
无代码文章精选
- 写给所有人的编程思维
- 2020 年 Tester 自我提升
- 自动化新手要避免的坑(上)
- 自动化新手要避免的坑(下)
- 如何成为全栈自动化工程师
- 简化测试用例
- 软件测试中的虚拟化
- 生产环境中进行自动化测试
- 所谓 UI 测试
点击查看所有文章
TesterHome 为用户提供「保留所有权利,禁止转载」的选项。
除非获得原作者的单独授权,任何第三方不得转载标注了「原创声明:保留所有权利,禁止转载」的内容,否则均视为侵权。
具体请参见TesterHome 知识产权保护协议。
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。