2

この例は、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

誰も理由を知っていますか?

リフレクション コードを扱う場合、これは注意が必要です。

4

2 に答える 2

1

実際、これがバグではないかどうか疑問に思っています。説明として... NullObject は、ランタイム/中間の種類のオブジェクトです。null に対して何かを行う場合は、NullObject が使用されます。これと、NullObject#equals の実装は、a==null が true を返すことを示しています。その前にいくつかの内部コードがあるため、失敗を返します。たとえば、 equals などの代わりに compareTo が呼び出されたかどうかを判断します。このコードは次のように始まります

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

したがって、null==null は true を返しますが、NullObject==null は false を返します。一方、NullObject は、可能であれば漏れないようにする必要があります。null を返すように newInstance() を修正する必要があるかもしれません。

これにはhttp://jira.codehaus.org/browse/GROOVY-5769を記入しました

于 2012-10-25T15:11:46.133 に答える
0

NullObjectのequalsメソッドでは、次のように比較している場合trueにのみ返されます。null

のインスタンスNullObjectは厳密nullにはではないため、falseを返します...

他の人に電話をかけた場合にNullObject戻るべきかどうかは、おそらくメーリングリストで最もよく聞かれる質問です...私は前の質問を見つけることができるかどうかを調べます。trueequalsNullObject

于 2012-10-25T13:02:16.540 に答える