Подтвердить что ты не робот

Как использовать андроиды поддержки Android в kotlin?

Я разрабатываю приложения для Android и часто использую аннотации как проверку параметров времени компиляции, в основном андроид аннотации поддержки.

Пример в java-коде:

public class Test
{
    @IntDef({Speed.SLOW,Speed.NORMAL,Speed.FAST})
    public @interface Speed
    {
         public static final int SLOW = 0;
         public static final int NORMAL = 1;
         public static final int FAST = 2;
    }

    @Speed
    private int speed;

    public void setSpeed(@Speed int speed)
    {
        this.speed = speed;
    }
}

Я не хочу использовать перечисления из-за проблем с производительностью в Android. Автоматический конвертер в kotlin просто генерирует неверный код. Как использовать аннотацию @IntDef в kotlin?

4b9b3361

Ответ 1

Изменить: В случае, если вы пропустите комментарии к вопросу или этому ответу, стоит отметить, что следующий метод компилируется, но не создает проверку во время компиляции, которую вы получили бы в Java (что частично противоречит цели этого). Попробуйте вместо этого использовать класс enum.


Это на самом деле можно использовать @IntDef поддержки аннотацию, определив свои ценности за пределами класса аннотаций как const val s.

Используя ваш пример:

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

Обратите внимание, что в этот момент компилятору, по-видимому, требуется тип Long для аннотации @IntDef вместо реальных Int.

Ответ 2

В настоящее время невозможно достичь именно этого в Котлине, поскольку класс аннотации не может иметь тело, и поэтому вы не можете объявить в нем константу, которая будет обрабатываться с помощью IntDef. Я создал проблему в трекере: https://youtrack.jetbrains.com/issue/KT-11392

Для вашей проблемы, однако, я рекомендую вам использовать простой перечисление.

Ответ 3

Просто создайте класс @IntDef как класс Java и получите к нему доступ через код kotlin.

Пример:

1) Создайте свой класс типов:

public class mType {
    @IntDef({typeImpl.type1, typeImpl.type2, typeImpl.type3})
    @Retention(RetentionPolicy.SOURCE)
    public @interface typeImpl {
        int type1 = 0;
        int type2 = 1;
        int type3 = 2;
    }
}

2) Поместите эту функцию в любой объект Kotlin:

object MyObject{
    fun accessType(@mType.typeImpl mType: Int) {
       ...
    }
}

3) затем получить доступ к нему:

fun somOtherFunc(){ 
        MyObject.accessType(type1)
 }

** Обратите внимание: вам не нужно помещать метод доступа внутри объекта.

Ответ 4

Используйте это:

companion object {
    const val FLAG_PAGE_PROCESS = 0L//待处理
    const val FLAG_PAGE_EXCEPTION = 1L//设备异常
    const val FLAG_PAGE_UNCHECKED = 2L//未审核
    const val FLAG_PAGE_AUDIT = 3L//统计
    val FLAG_PAGE = "FLAG_PAGE"

    fun newInstance(@FlagPageDef flagPage: Int): RepairFormsListFragment {
        val fragment = RepairFormsListFragment()
        val args = Bundle()
        fragment.arguments = args
        return fragment
    }

    @Retention(AnnotationRetention.SOURCE)
    @IntDef(FLAG_PAGE_PROCESS, FLAG_PAGE_EXCEPTION, FLAG_PAGE_UNCHECKED, FLAG_PAGE_AUDIT)
    annotation class FlagPageDef
}