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

18
demandé sur johnny_crq 2016-06-15 13:52:32

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.

20
répondu yole 2016-06-15 15:21:23

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
    }
}
25
répondu Dima Rostopira 2018-04-24 09:00:07

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
}
2
répondu Enrico 2016-06-15 15:49:03

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.

0
répondu evi 2018-08-07 11:05:33