Notez que vous pouvez utiliser le modèle explicit implicit qui éviterait la confusion et de garder le code laconique en même temps.
Ce que je veux dire par implicite explicite est plutôt que d'avoir une conversion directe T
-Option[T]
vous pourriez avoir une conversion à un objet enveloppe qui fournit les moyens de faire la conversion T
-Option[T]
.
class Optionable[T <: AnyRef](value: T) {
def toOption: Option[T] = if (value == null) None else Some(value)
}
implicit def anyRefToOptionable[T <: AnyRef](value: T) = new Optionable(value)
... je pourrais trouver un meilleur nom pour elle que Optionable
, mais maintenant vous pouvez écrire du code comme:
val x: String = "foo"
x.toOption // Some("foo")
val y: String = null
x.toOption // None
Je crois que cette façon est totalement transparente et contribue à la compréhension des le code écrit - éliminant tous les contrôles pour null d'une manière agréable.
Notez le T <: AnyRef
- vous ne devez effectuer cette conversion implicite que pour les types qui acceptent les valeurs null
, qui sont par définition des types de référence.
Au moins dans IntelliJ IDEA je peux voir quand quelque chose est auto-converti (par défaut il est souligné). Mais peut-être qu'il devrait y avoir un moyen de spécifier qu'une conversion implicite ne devrait avoir lieu que lors de la transmission de la valeur à une méthode, et non lors de l'appel d'une méthode. – herman