Ceci lève l'erreur: Exception dans le thread "main" java.lang.IllegalArgumentException: Pas de constante d'énumération Color.red
print(Color.valueOf("RED"))
Ce qui précède ne fonctionnera que si je change l'instruction d'impression en:
enum class Color(val value: String = "") { RED("red"), YELLOW("yellow"), BLUE("blue") } fun main() { print(Color.valueOf("red")) }
Est-il possible d'utiliser une chaîne personnalisée pour attribuer à une valeur d'énumération à l'aide de valueOf?
3 Réponses :
Non, mais vous pouvez écrire votre propre méthode et obtenir la valeur par itération, quand
ou par carte.
De plus, vous ne pouvez pas remplacer valueOf
.
Comme vous l'avez découvert, la méthode enum valueOf ()
recherche par le nom de la constante enum, pas par les propriétés que vous ajoutez.
Mais vous pouvez facilement ajouter votre propre méthode de recherche, en utilisant les critères que vous voulez:
enum class Color(val hue: String) { RED("red"), YELLOW("yellow"), BLUE("blue"); companion object { fun forHue(hue: String) = values().find{ it.hue == hue } } }
Un appel à Color.forHue ("red")
renvoie le code Color.RED > comme prévu.
(C'est probablement l'approche la plus simple, mais pas la plus efficace; voir des réponses telles que ceci .)
Vous pouvez implémenter votre propre valueOf
qui fonctionne sans tenir compte de la casse:
enum class Color(val value: String = "") { RED("red"), YELLOW("yellow"), BLUE("blue"); companion object { //TODO: gimme a better name fun customValueOf(val: String) = valueOf(val.toUpperCase()) } }