Котлин Аннотация 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-способ сделать эту проверку времени компиляции

 Dima Rostopira27 февр. 2017 г., 13:53
 johnny_crq15 июн. 2016 г., 14:08
нет причин просто жалкий. Google несколько лет назад не одобрял перечисления из-за соображений производительности. Я привык предпочитать статические константы с аннотациями intdef. Но когда я перешел на Kotlin, эта функция исчезла
 miensol15 июн. 2016 г., 13:20

Ответы на вопрос(4)

Мой предпочтительный способ использовать IntDef с Kotlin - использовать объявления верхнего уровня:

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

Никаких дополнительных классов или объектов не требуется! Подробнее о объявлениях на высшем уровнеВот.

Решение Вопроса

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

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

 もっくん03 апр. 2018 г., 07:23
@yoleyoutube.com/watch?v=Hzs6OBcvNQE (Цена ENUM (100 дней Google Dev))
 Raeglan13 мар. 2018 г., 17:01
«Например, перечисления часто требуют вдвое больше памяти, чем статические константы. Вы должны строго избегать использования перечислений на Android». -developer.android.com/topic/performance/memory.html#Overhead
 Raeglan13 мар. 2018 г., 17:02
Я хотел знать, имеет ли значение то, как Котлин обрабатывает перечисления.
 hqzxzwb27 авг. 2018 г., 13:04
@yole Он был удален из памяти, но не отсюда:developer.android.com/topic/performance/reduce-apk-size
 yole13 мар. 2018 г., 16:57
Нет, они не.
 milosmns16 авг. 2019 г., 10:22
Это правда, что перечисления имеют немного больший след памяти по сравнению с целыми числами, но это уже не имеет большого значения. В любом случае у вас нет 100 перечислений, плюс ART теперь оптимизирует использование памяти перечислений. Но даже если вы действительно ограничены с точки зрения памяти, обратите внимание, что если вы используете оптимизацию Proguard (или D8 / R8), она может преобразовать простые перечисления в целые числа, поэтому, если у вас нет никаких дополнительных свойств перечисления, это будет наиболее скорее всего, произойдет из коробки.guardsquare.com/en/products/proguard/manual/usage/optimizations Ищуclass/unboxing/enum.
 yole03 апр. 2018 г., 12:49
@Raeglan Этот совет больше не актуален для АРТ; теперь он был удален со страницы документа, на которую вы ссылались.
 もっくん03 апр. 2018 г., 07:23
@Raeglan Мне интересно то же самое.
 Raeglan13 мар. 2018 г., 16:33
Разве перечисления не очень неэффективны на Android?
 LiTTle17 мая 2019 г., 11:13
Любые новости оenumс противIntDef для размера apk? Должны ли мы придерживатьсяIntDef?

Странная вещь, но этот вопрос встает в поиске раньше того же самого справильный ответ

Копирую это здесь:

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
    }
}
 Billyjoker11 июл. 2019 г., 17:46
Меня устраивает. В моем случае я хотел определение String, поэтому я заменил IntDef на StringDef, я определил val как строки и работает правильно
 Dima Rostopira01 мар. 2017 г., 11:43
@ user3806331 не согласен. Автозаполнение не единственная точка. Это полезно, потому что аннотированный параметр проверяется во время компиляции, поэтому вы не можете вызвать эту функцию с-1L по ошибке
 w3bshark17 июл. 2017 г., 19:07
Я не думаю, что это правда. Я протестировал использование @StringDef в качестве первой части параметров конструктора моего класса Kotlin, и предупреждение / ошибка времени компиляции никогда не выдавались, когда я передавал ему недопустимый тип.
 Sanf0rd05 янв. 2019 г., 01:17
@DimaRostopira, я понял вашу точку зрения, но у этого кода нет завершения или проверки аннотаций во время компиляции.
 johnny_crq01 мар. 2017 г., 11:40
это ничего не решает. Вы можете создавать аннотации так же, как Java, но вы не можете извлечь выгоду из использования IntDef на Kotlin, потому что компилятор не знает, как его интерпретировать. Преимущество IntDef заключается в том, что он будет отображаться при автозаполнении, и, следовательно, в большинстве случаев вы можете использовать контакты IntDef вместо enum. Уберите часть компилятора, и сама аннотация бесполезна.

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

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

ч / тТоник Артос

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

companion object{
    const val UNIT_NONE = -1L
    const val UNIT_KG = 1L
    const val UNIT_LB = 0L
}
 johnny_crq15 июн. 2016 г., 17:59
нах: р я нет. Ага. но все равно спасибо за совет. может помочь другому государству

Ваш ответ на вопрос