Tengo una enumeración de Scala y quiero obtener el valor de enumeración de String.

object CVVStatus extends Enumeration {
  type CVVStatus = Value
  val PRESENT, NOT_PRESENT, VALID, INVALID = Value
}

Quiero hacer algo como esto:

val prop = new Properties()
prop.load(new FileInputStream("config.conf"))
val tmp = prop.getProperty(propname)
val s:CVVStatus = StringtoEmum(tmp)

Si necesito mucha enumeración de diferentes nombres de objeto de enumeración a objetos de enumeración, ¿cómo debo lograr esto? ¿Qué paquete debo importar?

1
user504909 18 ago. 2016 a las 03:15

2 respuestas

La mejor respuesta

Como @Alec señala en un comentario, esto es 'gratis' con Clase de enumeración, y es fácil de ver en una hoja de trabajo:

object CVVStatus extends Enumeration {
  type CVVStatus = Value
  val PRESENT, NOT_PRESENT, VALID, INVALID = Value
}

val test_present = "PRESENT"  // test_present: String = PRESENT
val test_incorrect = "INCORRECT"  // test_incorrect: String = INCORRECT
val enumeration_present = CVVStatus.withName(test_present)  // enumeration_present: CVVStatus.Value = PRESENT
val enumeration_incorrect = CVVStatus.withName(test_incorrect)  //java.util.NoSuchElementException: No value found for 'INCORRECT'

Este último falla, porque no es una enumeración válida. La documentación de withName dice:

Devuelve un valor de esta enumeración cuyo nombre coincide con el argumento s. Los nombres se determinan automáticamente mediante reflexión.

No se necesitan importaciones.

0
Nathaniel Ford 18 ago. 2016 a las 01:37

También puede considerar el uso de objetos de casos. Como referencia, consulte estas respuestas de stackoverflow Objetos de caso frente a enumeraciones Cómo acceder a objetos dentro de un objeto al mezclar un rasgo con un reflejo?

0
Community 23 may. 2017 a las 12:08