class methods on null in scala
i recently was debugging a simple refactoring of some scala code that led to a surprise NullPointerException
. we generally avoid using null
and prefer to use Option[T]
where None replaces (null: T)
, and we assume in our code base that no null
will be passed in. in this case it seemed a null had sneaked in there anyhow, and before the refactoring we handled it correctly while after the refactoring we were no longer, leading to the NullPointerException
. while digging it in seemed like we were magically able to handle methods on null
instances of a class! so this is a blog post about some funky edge case in scala that made this possible.
lets assume we have a class for a person and we want to check if the person is null
. you could try this:
case class Person(first: String, last: String) {
def isNull: Boolean = this == null
}
but of course this method isNull
doesn’t do anything useful because you cannot call a method on null
:
scala> Person("koert", "kuipers").isNull
val res0: Boolean = false
scala> (null: Person).isNull
java.lang.NullPointerException
... 59 elided
so what i realized by accident while debugging is that there is a way to make this work using scala’s implicit class:
case class Person(first: String, last: String)
implicit class RichPerson(val person: Person) extends AnyVal {
def isNull: Boolean = person == null
}
now the result is:
scala> Person("koert", "kuipers").isNull
val res0: Boolean = false
scala> (null: Person).isNull
val res1: Boolean = true
i cannot recommend relying on this! however i thought it was fun to share…
author: koert (koert at tresata.com)