加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Groovy神奇的NullObject

发布时间:2020-12-14 16:50:26 所属栏目:大数据 来源:网络整理
导读:在这篇文章里,我将向你展示Java和Groovy中 null 不怎么明显的的区别。 让我们从下面这行代码开始: Object o = null 这条语句在Java和Groovy下都可以运行(只是在Java下需要在行尾加一个 ; )。 然而,它们是有略微的区别的。 在Java中, null 是一个特殊的

在这篇文章里,我将向你展示Java和Groovy中null不怎么明显的的区别。

让我们从下面这行代码开始:

Object o = null

这条语句在Java和Groovy下都可以运行(只是在Java下需要在行尾加一个;)。

然而,它们是有略微的区别的。

在Java中,null是一个特殊的字面值。它被分配一个引用类型,但没有指向任何对象。每次都你试图在一个null引用上做些什么的时候(像调用方法或访问变量),都会抛一个NullPointerException

在Groovy中,null是一个对象。它是org.codehaus.groovy.runtime.NullObject的一个实例。大多数时候,NullObject会抛NullPointerException,如果你试图在null上调用一个方法或者变量。然而,NullObject的一些方法是可以调用的:

import org.codehaus.groovy.runtime.NullObject

	assert NullObject == null.getClass()
	assert       true == null.equals(null)
	assert      false == null.asBoolean()
	assert    "null!" == null + "!"
	assert      false == null.iterator().hasNext()

可以看出,null对象可以预防空指针异常。asBoolean()返回总是返回false,这样就可以保证null可以在需要的时候被转换成一个boolean值。iterator()方法返回的是一个java.util.Collections$EmptyIterator,因为这样就可以安全的在任何对象上调用iterator方法,而不需要显示的检查null。

有趣的是,我在groovy的官方文档没有找到任何NullObject的信息。在Differences from Java nor和Groovy’s Null Object Pattern,也没有提到。

很难找到实用案例来说明NullObject,不过,你可以创建你自己的NullObject实例。

Class c = null.getClass()
	NullObject myNull = c.newInstance()

请注意下面,只有equals()方法只有在你传NullObject的默认实例时才返回true。所以,你的NullObject实例只会返回false。

assert false == myNull.equals(myNull)
	assert true == myNull.equals(null)

你也可以通过修改NullObject的元信息以添加你自己的方法:

NullObject.metaClass.myMethod = { println "I am null" }
	null.myMethod()

PS:事实上,从false == myNull.equals(myNull)看到,这个语言同样没有很高度的一致性。因为连自己都不equals自己了,我觉得这就是不一致。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读