Как использовать андроиды поддержки 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?
Ответы
Ответ 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
}