我正在努力更换unapply
案例类的伴随对象上的方法与我自己的实现。在调查了许多与实施相关的不同切线之后unapply
,看来有一个null
其中大多数都受到保护,无论是在编译器生成的代码中还是在显式重新定义的实现中。编译器生成的代码为unapply
看起来与此类似(其中一些使用eq
代替ne
):
def unapply(location: Location): Option[(Double, Double)] =
if (location ne null)
Some((location.longitude, location.latitude))
else
None
鉴于绝对不应该使用null
在纯(即惯用的)Scala 代码中,为什么会这样null
正在执行检查?和Java互操作有关系吗(因为Java还是沉迷于利用null
)泄漏到unapply
方法?如果我删除该检查,我会遭受什么(如果有的话)不良后果,因为我已经消除了案例类实例的可能性unapply
传递的方法可以为 null 也可以为 invalid? IOW,用这个替换上面的实现有什么害处?
def unapply(location: Location): Option[(Double, Double)] =
Some((location.longitude, location.latitude))
否则,这会产生非常令人惊讶的行为:
nullableJavaMethod() match {
case Location(lat, long) => "Handle location here!"
case null => "Handle null here!"
}
您可能更喜欢另一种处理 null 的方法,但这并不意味着如果有人更喜欢这种方法,您应该像上面的 NPE 崩溃一样。请注意,这是特定于unapply
,因为其他方法不会遇到上述问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)