#NullSafety #Rave #Uber
How Uber Engineering Verifies Data at Runtime with the Annotations You Already UseСталкивались ли вы с проблемой, что данные, присылаемые сервером, отличается от ожидаемых вами в описанных вами моделей (классов)? Например, поле которое у вас объявлено как
@NonNull вдруг пришло
null? Или значение одного из полей моделей должно быть в пределах от
0 до
1, но сервер прислал
1.5?
Не будьте уверены в своем сервере на 100%, так как может что-то поменяться в любой момент и вы начнете ловить странные баги из-за изменений возможных значений в полях. Как итог - трата большого количества времени на поиск проблемы.
Для того чтобы избежать такого рода проблем, в Uber разработали библиотеку
Rave. Она генерирует класс, который на основе аннотаций модели, позволяет проверять, что все данные соответствуют вашим ожиданиям, а в противном случае выбрасывает исключение.
Поддерживаютс
я следующие аннотации:
👉
@NonNull и
@Nullable👉
TypeDef аннотации:
@StringDef,
@IntDef и
@LongDef👉
Аннотации ограничений на значения:
@IntRange,
@FloatRange,
@Size и др.
👉 Собственные аннотации
@MustBeFalse и
@MustBeTrue, которыми могут быть аннотированы методы, проверяющие более сложные условия для данных внутри модели.
Валидация кода выглядет следующим образом:
void validateMyModel(SimpleModel myModel) { try { Rave.getInstance().validate(myModel); } catch (UnsupportedObjectException e) { // handle unsupported error case. } catch (RaveException e) { // handle rave validation error. }}Rave эффективна для интеграции с библиотеками, которые предоставляют сериализованые данные (например JSON), а вы их на стороне клиента парсите в объекты языка. Яркий пример REST сервис, с которым вся работа в Android приложения осуществляется на основе библиотеки
Retrofit, причем уже есть готовый конвертер -
RaveConverterFactory.