0
votes

Comment obtenir le nom de Java Enum à Kotlin

J'ai un projet qui est écrit avec les langues Java et Kotlin et récemment, j'ai rencontré le prochain numéro.

Disons que nous avons myMonth code> Enum: p> xxx pré>

puis à Kotlin lorsque nous imprimons le nom du mois: p>

fun main() {
    val month = MyMonth.JAN
    println(month.name)
}


2 commentaires

Ne devriez-vous pas appeler myminth.jan.name à la place?


Je suppose que kotlin Enums a déjà un nom nom , comme vu ici , il y a un conflit entre la propriété Java Getter et la propriété de Kotlin. Si possible, je vous recommande de changer le nom du champ Java et de getter à autre chose que nom et getName () . Personnellement, je pense que c'est une mauvaise idée d'avoir un champ nommé Nom dans une Java Enum de toute façon, compte tenu de l'existence de la méthode Name () . Si vous ne pouvez pas le changer, et si vous appelez getname () explicitement dans le code de kotlin?


3 Réponses :


4
votes

Votre API Java a Nom comme champ privé . Rien ne peut y accéder, pas en Java ni Kotlin.

Si vous voulez y accéder, ajoutez E.G. Ce qui suit à l'API Java: xxx

... puis l'accédez à partir de kotlin comme xxx


4 commentaires

En Java, je peux simplement ajouter un getter et appeler myminth.jan.getname () qui me retournerait ce dont j'ai besoin. Mais ce getter n'est pas utilisé à Kotlin, même si l'idée me montre que c'est à partir de là, je vais mettre à jour ma question pour le rendre plus clair.


Hey @slaw C'est une bonne suggestion, malheureusement, il n'est pas possible de renommer ce domaine car je ne suis pas le propriétaire de la bibliothèque qui a cette énumération. De plus, je pense que ce n'est pas si rare lorsque vous avez un Java Enum qui a champ Nom .


nom est spécifiquement compliqué en étant déjà cuit dans la définition pour Enums. Vous devrez peut-être juste appeler GetName () explicitement et ne pas l'utiliser comme une propriété, même si Intellij vous dit que vous n'êtes pas obligé. Cela peut être pivotant couché.


Oui, je comprends que nom est cuit à Kotlin Enum, vient de remarquer ce comportement étrange et était confus pendant un moment. Merci!



2
votes

Vous pouvez appeler le getter directement au lieu d'utiliser la syntaxe de la propriété: xxx


3 commentaires

@Orest c'est parce que nom est réservé à Enums. Si vous pouviez choisir un autre nom de propriété, alors ce serait non excessive


@OREST Vous pouvez faire une vulgarisation qui appelle GetName () pour que cela ait l'air plus idiomatique


@Nikolaisishevchenko Oui, il est clair pour moi, mais j'ai déjà mentionné que dans les commentaires que ce n'est pas si rare lorsque vous devez utiliser un énumé qui vient de Java avec nom et que vous n'êtes pas en mesure de changes le



0
votes

Enum est maintenant faible utilisation. Vous pouvez utiliser Intdef au lieu d'ENUMS.

@IntDef(MyMonth.JAN, MyMonth.FEB)
@Retention(AnnotationRetention.SOURCE)
annotation class MyMonth  {
    companion object {
        const val JAN = 0
        const val FEB = 1

        fun getDisplayString(toDoFilterTypes: Int): String {
            return when (toDoFilterTypes) {
                JAN -> "All"
                FEB -> "Job"
                else -> "N/A"
            }
        }
    }
}


0 commentaires