2016-06-15 5 views
10

У меня есть этот образец коды:Котлин Аннотации 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 поддерживается в Котлин (последняя версия)

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

  • Если это не так, есть ли Котлин-способ делают эту компиляцию проверки времени

+2

[Почему вы не используете 'enum'] (http://stackoverflow.com/questions/5143256/why-was-avoid-enums-where-you -только-потребность-Ints-удаленной от-андроидов-ЭКСПЛУАТАЦИОННЫЕ)? – miensol

+0

нет причины просто жалкая. Репутация была обескуражена пару лет назад Google из-за соображений производительности. Я предпочитаю статические константы с аннотациями intdef. Но когда я перешел на Kotlin, эта функция исчезла –

+1

Возможный дубликат [Как использовать андроиды поддержки Android в kotlin?] (Http://stackoverflow.com/questions/35976002/how-to-use-android-support-typedef -annotations-in-kotlin) –

ответ

17

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

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

2

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

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

ч/т Tonic Artos

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

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

nah: pi am нет. Ага. но спасибо за подсказку в любом случае. может помочь другому ppl –

13

Странная вещь, но этот вопрос приходит в поиске до этого же right answer

Копирование его здесь:

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

это ничего не решает. Вы можете создавать аннотации так же, как Java, но вы не можете использовать IntDef на Kotlin, потому что компилятор не знает, как интерпретировать его. Преимущество IntDef заключается в том, что он будет отображаться при автозавершении, и поэтому вы можете в большинстве случаев использовать контакты IntDef вместо enum. Уберите часть компилятора, и аннотация сама по себе бесполезна. –

+1

@ пользователь3806331 не согласен. Автокомплект - не единственная точка.Это полезно, потому что аннотированный параметр проверяется во время компиляции, поэтому вы не можете вызвать эту функцию с '-1L' по ошибке –

+6

Я не думаю, что это правда. Я тестировал, используя @StringDef, как часть одного из параметров конструктора класса Kotlin, и предупреждение об ошибке компиляции никогда не возникало, когда я передавал ему недопустимый тип. – w3bshark

Смежные вопросы