Как применить аннотацию поддержки @IntRange () к установщику свойств Kotlin?

Я пытался выяснить, как применить @IntRange(from = 1) к моему свойству Kotlin. После нескольких неудачных попыток я, наконец, просто создал нужный класс на Java и преобразовал его в Kotlin внутри Android Studio. Вот мой класс Java:

import android.support.annotation.IntRange;

public class SimpleThing {

    private int val;

    @IntRange(from = 1)
    public int getVal() {
        return val;
    }

    public void setVal(@IntRange(from = 1) int val) {
        this.val = val;
    }

}

и это автоматическое преобразование, которое я получил от Android Studio:

import android.support.annotation.IntRange

class SimpleThing {

    @get:IntRange(from = 1)
    var `val`: Int = 0

}

@IntRange, похоже, применяется к геттеру, но не к сеттеру. Можно ли применить эту аннотацию к сеттеру, чтобы появилось соответствующее предупреждение о ворсинах. В настоящее время я только что переопределил метод set, чтобы создать исключение IllegalArgumentException следующим образом:

@get:IntRange(from = 1)
var rowSize: Int = 3
    set(value) {
        if (value < 1) throw IllegalArgumentException("row size must be at least 1")
        field = value
        notifyDataSetChanged()
    }

Я уже пробовал добавить @set:IntRange(from = 1), но получаю сообщение об ошибке This annotation does not apply for type void, потому что он пытается применить @IntRange к возвращаемому значению (которое недействительно в случае установщика) в отличие от аргумента установщика.

8
0
4 351
2

Ответы 2

В настоящее время не в состоянии проверить это, но пробовали ли вы добавить такой @set:

@set:IntRange(from = 1)
@get:IntRange(from = 1)
    var `val`: Int = 0

Ага, это уже пробовал. Я получаю сообщение об ошибке This annotation does not apply for type void. Я думаю, что проблема должна быть в каком-то способе указать, что аннотация относится к аргументу метода, а не к типу возвращаемого значения.

Moses 02.05.2018 12:44

Я ищу аннотацию @setparam, но в Android Studio не появляется предупреждение о ворсинах, когда я пытаюсь назначить значение за пределами диапазона.

Вот мой новый код:

@get:IntRange(from = 1)
@setparam:IntRange(from = 1)
var rowSize: Int = 3
    set(value) {
        if (value < 1) throw IllegalArgumentException("row size must be at least 1")
        field = value
        notifyDataSetChanged()
    }

и здесь я обычно ожидал увидеть предупреждение о ворсинках, сообщающее мне, что я назначаю значение за пределами диапазона int

Однако предупреждение о линтах появляется при использовании класса SimpleThing в коде Kotlin.

Предупреждение о линтах также не появляется при вызове метода Kotlin как Java-кода.

Казалось бы, этот функционал просто еще не реализован.

Да то же самое. Аннотации Androidx не применяются линтером в котлине

MatPag 05.04.2019 15:15

Другие вопросы по теме