3
votes

Kotlin vous permet-il d'attribuer une valeur personnalisée à enum?

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?


0 commentaires

3 Réponses :


1
votes

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 .


0 commentaires

3
votes

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 .)


0 commentaires

0
votes

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())
    }
}


0 commentaires