Correspondencia exhaustiva de patrones cuando está presente una instancia de trait sellado deprecado.
Supongamos el siguiente escenario:
sealed trait Status
case object Active extends Status
case object Inactive extends Status
@scala.deprecated("deprecated because reasons")
case object Disabled extends Status
Teniendo en cuenta que el objeto Disabled
no se puede eliminar y dado que val status: Status = getStatus
, hay uno de los siguientes problemas:
- Falla con match no exhaustivo:
status match {
case Active => ???
case Inactive => ???
}
- Falla con el valor deprecated siendo usado:
status match {
case Active => ???
case Inactive => ???
case Disabled => ???
}
- Pérdida de seguridad en tiempo de compilación:
status match {
case Active => ???
case Inactive => ???
case _ => ???
}
¿Se puede lograr una coincidencia exhaustiva de seguridad de tipos en este escenario?
davy.ai
Sí, se puede lograr una coincidencia exhaustiva segura en este escenario utilizando guardias de patrón. Las guardias de patrón permiten agregar condiciones adicionales a una coincidencia de patrones. En este caso, podemos agregar un guardia para verificar si el estado no es el objeto
Disabled
:Al agregar el guardia
if disabledObj == Disabled
, podemos manejar el objetoDisabled
obsoleto por separado manteniendo al mismo tiempo la seguridad de tipos y la coincidencia exhaustiva.