Обеспечить аннотации Android во время компиляции / выполнения - PullRequest
0 голосов
/ 18 октября 2018

В качестве примера ниже приведен очень простой класс:

public class Demo {
    private int val;

    public int getVal() {
        return val;
    }

    public void setVal(@IntRange(from = 1, to = 10) int v) {
        val = v;
    }
}

Здесь я задаю диапазон для val , используя IntRange.Это прекрасно работает, когда я создаю новый объект и пытаюсь установить значение вне диапазона в моем коде.Например:

Demo d = new Demo();
d.setVal(500);  //android studio highlights this as lint-warning

Тем не менее, я хотел бы включить проверку диапазона в compile и runtime и ожидать появления ошибки, когда значение не находится в диапазоне.

Как мне этого добиться?

PS Я знаю, что могу проверить диапазон в методе setVal перед обновлением моей переменной, но я не за этим слежу и будукак решение с помощью библиотеки аннотаций Android.

1 Ответ

0 голосов
/ 18 октября 2018

Для применения этой аннотации на время компиляции для выпусков сборки добавьте lint.xml файл со следующим содержимым в корень вашего модуля

<lint>
    <issue id="Range" severity="fatal"/> 
</lint>

Этим вы переопределяете серьезность предупреждения lint «Range», и сборка выпуска завершится неудачей , если произойдет это предупреждение

Может быть возможно реализовать механизм, который будет применять эту аннотациюво время выполнения (например, с использованием пользовательского процессора аннотаций), но это намного сложнее и не стоит усилий

Реализация с помощью обработки аннотаций может работать следующим образом:

Исходный класс с аннотацией @IntRange

public class Demo {
    private int val;

    public int getVal() {
        return val;
    }

    public void setVal(@IntRange(from = 1, to = 10) int v) {
        val = v;
    }
}

Вы можете реализовать процессор аннотаций для генерации следующего класса из вашего начального Demo класса
(сгенерированного во время компиляции)

public class DemoWithChecks extends Demo {
    public void setVal(int v) {
        if (v >= 1 && v <= 10) {
            super.setVal(v)
        } else {
            //value out of range - throw exception or whatever
        }
    }
}

Затем вы можете использовать DemoWithChecksвместо Demo в вашем коде для обеспечения проверки аннотаций во время выполнения.

PS Хорошая статья о написании ваших собственных процессоров аннотаций здесь

...