Kotlin Annotation IntDef
j'ai cet exemple de code:
class MeasureTextView: TextView {
constructor(context: Context?) : super(context)
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes)
companion object{
val UNIT_NONE = -1
val UNIT_KG = 1
val UNIT_LB = 0
}
fun setMeasureText(number: Float, unitType: Int){
val suffix = when(unitType){
UNIT_NONE -> {
EMPTY_STRING
}
UNIT_KG -> {
KG_SUFIX
}
UNIT_LB -> {
LB_SUFIX
}
else -> throw IllegalArgumentException("Wrong unitType passed to formatter: MeasureTextView.setMeasureText")
}
// set the final text
text = "$number $suffix"
}
}
je veux pouvoir utiliser, au moment de la compilation, la fonctionnalité auto complete en conjonction avec l'annotation IntDef, donc quand j'invoque setMeasureText(...)
,
les variables statiques sont montrées comme options à l'argument de cette méthode.
j'ai cherché à ce sujet, et je n'ai pas pu trouver si Kotlin supportait ces annotations de style java (intdef par exemple). J'ai donc essayé, et fait une annotation pour cela, mais il n'apparaît pas dans complétion.
ma question: - Java annotation IntDef supportée par Kotlin (dernière version)
si c'est le cas, comment puis-je activer L'IDE D'Android Studio (si cela fonctionne, Je ne peux pas obtenir du compilateur qu'il le suggère).
si ce n'est pas le cas, y a-t-il une façon Kotlin de faire cette vérification du temps de compilation
4 réponses
à partir de Kotlin 1.0.3, le @IntDef
l'annotation n'est pas supportée, mais le support est prévu pour les versions ultérieures.
la façon Kotlin de faire ces vérifications de temps de compilation est d'utiliser un enum class
au lieu d'une série de Int
constantes.
chose étrange, mais cette question vient à la recherche avant la même avec réponse
Copier ici:
import android.support.annotation.IntDef
public class Test {
companion object {
@IntDef(SLOW, NORMAL, FAST)
@Retention(AnnotationRetention.SOURCE)
annotation class Speed
const val SLOW = 0
const val NORMAL = 1
const val FAST = 2
}
@Speed
private var speed: Int=SLOW
public fun setSpeed(@Speed speed: Int) {
this.speed = speed
}
}
Si vous appelez setMeasureText
à partir de Java, vous pouvez le faire fonctionner en créant votre IntDef en Java aussi
// UnitType.java
@Retention(RetentionPolicy.SOURCE)
@IntDef({MeasureText.UNIT_KG, MeasureText.UNIT_LB, MeasureText.UNIT_NONE})
public @interface UnitType {}
h / t Artos Toniques
vous devrez également mettre à jour votre objet compagnon pour rendre vos valeurs longues et accessibles au public
companion object{
const val UNIT_NONE = -1L
const val UNIT_KG = 1L
const val UNIT_LB = 0L
}
ma façon préférée d'utiliser IntDef avec Kotlin est d'utiliser des déclarations de haut niveau:
package com.example.tips
const val TIP_A = 1
const val TIP_B = 2
const val TIP_C = 3
@IntDef(TIP_A, TIP_B, TIP_C)
@Retention(AnnotationRetention.SOURCE)
annotation class TipId
class TipsDataProvider {
fun markTip(@TipId tipId: Int) {
...
}
}
aucune classe ou objet supplémentaire requis! En savoir plus sur les déclarations de haut niveau ici.