Почему в реализации метода `unapply` для case-классов есть проверка 'null`?

Я работаю, чтобы заменить 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 переданный метод может быть нулевым или недействительным? Итак, какой вред замены вышеуказанной реализации на эту?

def unapply(location: Location): Option[(Double, Double)] =
  Some((location.longitude, location.latitude))

1 ответ

В противном случае это даст очень удивительное поведение:

nullableJavaMethod() match {
  case Location(lat, long) => "Handle location here!"
  case null => "Handle null here!"
}

Вы могли бы предпочесть другой подход к обработке пустых значений, но это не означает, что вы должны создавать такие случаи, как описанный выше сбой с NPE, если кто-то предпочитает такой подход. Обратите внимание, что это относится к unapply, так как другие методы не будут страдать от проблемы выше.

Другие вопросы по тегам