首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么case类的`unapply`方法的实现会有一个`null`检查?

为什么case类的`unapply`方法的实现会有一个`null`检查?
EN

Stack Overflow用户
提问于 2019-05-28 03:34:11
回答 1查看 101关注 0票数 2

我正在用我自己的实现替换case类的伴生对象上的unapply方法。在研究了许多与实现unapply相关的不同切点之后,似乎在它们中的大多数都存在null保护,无论是在编译器生成的代码中还是在显式重新定义它的实现中。来自编译器为unapply生成的代码的代码如下所示(其中一些代码使用eq而不是ne):

代码语言:javascript
复制
def unapply(location: Location): Option[(Double, Double)] =
  if (location ne null)
    Some((location.longitude, location.latitude))
  else
    None

既然在纯(即惯用的) Scala代码中绝对不应该使用null,为什么要执行这个null检查呢?这是否与Java interop (因为Java仍然沉迷于利用null)泄漏到unapply方法有关?如果我删除了复选标记,因为我已经排除了将unapply方法传递到的case类实例可以为空或无效的可能性,那么我将遭受什么(如果有的话)的不良后果?那么,用这个替换上面的实现有什么害处呢?

代码语言:javascript
复制
def unapply(location: Location): Option[(Double, Double)] =
  Some((location.longitude, location.latitude))
EN

回答 1

Stack Overflow用户

发布于 2019-05-28 13:55:27

否则,这将产生非常令人惊讶的行为:

代码语言:javascript
复制
nullableJavaMethod() match {
  case Location(lat, long) => "Handle location here!"
  case null => "Handle null here!"
}

您可能更喜欢另一种方法来处理null,但这并不意味着如果有人更喜欢这种方法,您就应该使用NPE来处理上面的崩溃情况。请注意,这是特定于unapply的,因为其他方法不会受到上述问题的影响。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56331580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档