前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Groovy的神奇NullObject

Groovy的神奇NullObject

作者头像
FunTester
发布2020-04-13 18:54:47
2160
发布2020-04-13 18:54:47
举报
文章被收录于专栏:FunTesterFunTester

JavanullGroovynull的一些明显差异。首先看一下Demo:

Object o = null

该语句在JavaGroovy中工作正常(Java在行尾需要分号)。但是,其效果略有不同。

Java中,null是一种特殊对象,它被分配给不指向任何对象的引用类型。每次尝试对null引用执行任何操作(例如调用方法或访问成员变量)时,都会引发NullPointerException

Groovy中,null是一个对象!它是org.codehaus.groovy.runtime.NullObject的实例。大多数情况下,NullObject将抛出NullPointerException。但是,可以在NullObject上调用一些方法:

代码语言:javascript
复制
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()

控制台输出:

代码语言:javascript
复制
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实例:

代码语言:javascript
复制
Class c = null.getClass()
NullObject myNull = c.newInstance()

但是请注意,如果传入默认的NullObject实例,则equals()方法仅返回true。因此对于您自己的NullObject实例,它可能会出错:

代码语言:javascript
复制
   output myNull.equals(myNull)
        output myNull.equals(null)

控制台输出:

代码语言:javascript
复制
INFO-> false
INFO-> true

您还可以通过修改metaClassNullObject添加自定义的方法:

代码语言:javascript
复制
        NullObject.metaClass.test = {output(getMark())}
        null.test()

控制台输出:

代码语言:javascript
复制
INFO-> 1586415029

  • 郑重声明:“FunTester”首发,欢迎关注交流,禁止第三方转载。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FunTester 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档