Tenga en cuenta que podría utilizar el patrón explicit implicit que evitaría la confusión y mantendría el código al mismo tiempo.
Lo que quiero decir es explícita implícita en lugar de tener una conversión directa de T
a Option[T]
usted podría tener una conversión a un objeto envolvente que proporciona los medios para hacer la conversión de T
a 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)
... que podría encontrar un nombre mejor para él que Optionable
, pero ahora se puede escribir código como:
val x: String = "foo"
x.toOption // Some("foo")
val y: String = null
x.toOption // None
Creo que de esta manera es totalmente transparente y ayuda en la comprensión de el código escrito - eliminando todos los cheques por nulo de una manera agradable.
Tenga en cuenta que T <: AnyRef
solo debe realizar esta conversión implícita para los tipos que permiten los valores null
, que por definición son tipos de referencia.
Al menos en IntelliJ IDEA puedo ver cuando algo se convierte automáticamente (por defecto está subrayado). Pero tal vez debería haber una forma de especificar que una conversión implícita solo debería ocurrir al pasar el valor a un método, no cuando se llama a un método. – herman