【发布时间】:2019-10-13 08:31:06
【问题描述】:
我正在努力用我自己的实现替换案例类的伴随对象上的unapply 方法。在调查了与实现unapply 相关的许多不同切线之后,似乎在大多数情况下都存在null 保护,无论是在编译器生成的代码中,还是在显式重新定义的实现中。编译器为unapply 生成的代码与此类似(其中一些使用eq 而不是ne):
def unapply(location: Location): Option[(Double, Double)] =
if (location ne null)
Some((location.longitude, location.latitude))
else
None
鉴于在纯(即惯用的)Scala 代码中绝对不应该使用null,为什么要执行null 检查?它是否与 Java 互操作(因为 Java 仍然沉迷于利用 null)泄漏到 unapply 方法有关?如果我删除检查,因为我已经消除了 unapply 方法被传递到的案例类实例可能为 null 或无效的可能性,我将遭受什么(如果有的话)不良后果? IOW,用这个替换上述实现有什么害处?
def unapply(location: Location): Option[(Double, Double)] =
Some((location.longitude, location.latitude))
【问题讨论】:
-
this 可能会部分回答您的问题
-
我通读了那个答案,找不到任何解决空检查的内容,除了他的回答还包括空检查。发布的原始问题离我的具体问题太远了,我发现它对明确回答我上面的问题很有用。
-
如果你能保证
Location永远不会是null,那就没有坏处。强调“如果”。 -
@Lasf 知道了。鉴于这是我在过去 +8 年中最终使用和编写的所有 Scala 代码中所做的假设(这显然是更大的 Scala 社区的默认假设),这似乎是一个微不足道的保证。责任在于执行 Java 互操作以包含和限制可能感染 Scala 代码的任何类型的空“泄漏”,包括获取我的 Scala 代码,特别是包括点击我的
unapply方法。
标签: scala pattern-matching case-class unapply compiler-generated