【问题标题】:Groovy NullObject should be null or not?Groovy NullObject 是否应该为空?
【发布时间】:2012-10-25 12:55:28
【问题描述】:

这个例子可以很容易地在 groovy 控制台中测试。

var a 被评估为非 null 而 b 被评估为 null。

两者都是 org.codehaus.groovy.runtim.NullObject 的实例

def b = null

println b.getClass()
println b == null

def a = null.getClass().newInstance()

println a.getClass()
println a == null

有人知道为什么吗?

在处理反射代码时这是一件棘手的事情。

【问题讨论】:

    标签: reflection groovy null-object-pattern


    【解决方案1】:

    实际上,我想知道这是否不是错误。作为解释...... NullObject 是一种运行时/中​​间类型的对象。如果您对 null 执行任何操作,则使用 NullObject。这一点,以及 NullObject#equals 的实现说明 a==null 返回 true。它返回失败,因为在此之前有一些内部代码,例如确定是否调用 compareTo 而不是 equals 等。现在这段代码以

    开头
    if (left == right) return true; 
    if (left == null || right == null) return false;
    

    所以 null==null 将返回 true,但 NullObject==null 将返回 false。另一方面,如果可能,NullObject 不应泄漏。也许我们应该修复 newInstance() 以返回 null。

    我为此填写了http://jira.codehaus.org/browse/GROOVY-5769

    【讨论】:

      【解决方案2】:

      在NullObject的equals方法中,只有you are comparing itnull才返回true

      作为NullObject的一个实例,严格来说不是null,它返回false...

      NullObject 是否应该返回 true,如果您针对另一个 equals 调用另一个 NullObject,这可能是邮件列表中最好的问题...我会看看是否可以找到任何以前的问题。

      【讨论】:

      • 但在这种情况下,两个对象都是 NullObjects,对吧?或者“b”是严格的 null 并且 b.getClass() 正在混淆它?
      • 是的,两个对象都是NullObjectNullObject.equals 特别是(见上面的链接)检查to == null,这在Java实现中评估为false作为NullObject != null......不确定我解释得很好......
      • 我不明白为什么。在这两种情况下,都会有“to == null”,而“to”对象是 NullObject。
      • 是的,在 Java 中(NullObject 是用它编写的),只有null == null...NullObject != null
      猜你喜欢
      • 2013-06-19
      • 1970-01-01
      • 1970-01-01
      • 2021-02-24
      • 1970-01-01
      • 2014-01-01
      • 2015-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多