Kotlin Аннотация IntDef

У меня есть этот пример кода:

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

Я хочу иметь возможность использовать во время компиляции функцию автоматического завершения в сочетании с аннотацией IntDef, поэтому, когда я setMeasureText(...) , статические переменные отображаются как параметры аргумента этого метода.

Я искал об этом, и я не мог найти, поддерживал ли Kotlin эти аннотации в стиле java (например, intdef). Поэтому я попробовал это и сделал аннотацию для этого, но он не будет показан в автозавершении.

Мой вопрос: – Поддерживается ли Java-аннотация IntDef в Kotlin (последняя версия)

  • Если да, то как я могу включить ON в Android Studio IDE (если он работает, я не могу заставить компилятор предложить его).

  • Если это не так, есть ли какой-либо метод Kotlin, чтобы эти проверки времени компиляции

Начиная с Kotlin 1.0.3, аннотация @IntDef не поддерживается, но поддержка планируется для более поздних версий.

Способ Kotlin для выполнения этих проверок времени компиляции заключается в использовании enum class вместо последовательности Int констант.

Странно, но этот вопрос приходит в поисках до того же самого с правильным ответом

Копируем его здесь:

 import android.support.annotation.IntDef public class Test { companion object { @IntDef(SLOW, NORMAL, FAST) @Retention(AnnotationRetention.SOURCE) annotation class Speed const val SLOW = 0L const val NORMAL = 1L const val FAST = 2L } @Speed private lateinit var speed: Long public fun setSpeed(@Speed speed: Long) { this.speed = speed } } 

Если вы вызываете setMeasureText из Java, вы можете заставить его работать, создав IntDef на Java тоже

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

h / t Тоник Артос

Вам также нужно будет обновить свой объект-компаньон, чтобы сделать ваши ценности длинными и общедоступными

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