new method many constructors annotations kotlin

annotations - method - Anotación Kotlin IntDef



new in kotlin (4)

Tengo este ejemplo de código:

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" } }

Quiero poder utilizar, en tiempo de compilación, la función de autocompletar junto con la anotación IntDef, por lo que cuando invoco setMeasureText(...) , las variables estáticas se muestran como opciones al argumento de este método.

He buscado sobre esto y no pude encontrar si Kotlin era compatible con estas anotaciones de estilo java (por ejemplo, intdef). Así que lo probé, e hice una anotación para esto, pero no se mostrará en autocompletado.

Mi pregunta: - ¿Se admite la anotación de Java IntDef en Kotlin (última versión)?

  • Si es así, ¿cómo puedo activar el IDE de Android Studio? (Si funciona, no puedo hacer que el compilador lo sugiera).

  • Si no es así, ¿hay alguna forma Kotlin de hacer esta verificación de compilación?


A partir de Kotlin 1.0.3, no se admite la anotación @IntDef , pero se planea el soporte para versiones posteriores.

La forma de Kotlin de realizar estas comprobaciones de tiempo de compilación es utilizar una enum class lugar de una serie de constantes Int .


Cosa extraña, pero esta pregunta viene en búsqueda antes de lo mismo con la respuesta correcta

Copiándolo aquí:

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


Mi forma preferida de usar IntDef con Kotlin es usar declaraciones de nivel superior:

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

No se requiere clase u objeto extra! Más información sobre las declaraciones de alto nivel here .


Si está llamando a setMeasureText desde Java, puede hacer que funcione también creando su IntDef en Java.

// UnitType.java @Retention(RetentionPolicy.SOURCE) @IntDef({MeasureText.UNIT_KG, MeasureText.UNIT_LB, MeasureText.UNIT_NONE}) public @interface UnitType {}

Artos tónicos h / t

También deberá actualizar su objeto complementario para que sus valores sean largos y accesibles al público.

companion object{ const val UNIT_NONE = -1L const val UNIT_KG = 1L const val UNIT_LB = 0L }