Как применить аннотацию поддержки @IntRange () к установщику свойств Kotlin? - PullRequest
0 голосов
/ 01 мая 2018

Я пытался выяснить, как применить @IntRange(from = 1) к моей собственности в Котлине. После нескольких неудачных попыток я, наконец, просто создал нужный класс в 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 к возвращаемому значению (которое является недействительным в случае с установщиком), а не с аргументом установки.

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Похоже, что я ищу аннотацию @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

enter image description here

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

enter image description here

Предупреждение lint также не отображается при вызове метода Kotlin в виде кода Java

enter image description here

Может показаться, что эта функция просто еще не реализована.

0 голосов
/ 02 мая 2018

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

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