我正在用我自己的实现替换case类的伴生对象上的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 interop (因为Java仍然沉迷于利用null)泄漏到unapply方法有关?如果我删除了复选标记,因为我已经排除了将unapply方法传递到的case类实例可以为空或无效的可能性,那么我将遭受什么(如果有的话)的不良后果?那么,用这个替换上面的实现有什么害处呢?
def unapply(location: Location): Option[(Double, Double)] =
Some((location.longitude, location.latitude))发布于 2019-05-28 13:55:27
否则,这将产生非常令人惊讶的行为:
nullableJavaMethod() match {
case Location(lat, long) => "Handle location here!"
case null => "Handle null here!"
}您可能更喜欢另一种方法来处理null,但这并不意味着如果有人更喜欢这种方法,您就应该使用NPE来处理上面的崩溃情况。请注意,这是特定于unapply的,因为其他方法不会受到上述问题的影响。
https://stackoverflow.com/questions/56331580
复制相似问题