Почему в реализации метода `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
, так как другие методы не будут страдать от проблемы выше.