Удобный способ создания новых ограничений — агрегирование (объединение) уже имеющихся. В таком случае мы обходимся без класса реализации. Это совсем не сложно сделать, если имеющиеся ограничения обладают @Target(ElementType.ANNOTATION_TYPE), то есть при работе с ними одна аннотация может быть применена к другой. Такой подход называется «объединением ограничений» и позволяет создавать высокоуровневые ограничения.
Задание, проиллюстрированное в примере:
Описать класс Вагон. Значение поля ЕСР класса Вагон должно быть размером точно 6 символов и каждый символ обязательно должен быть цифрой. Создать новое ограничение для валидации поля ЕСР путём агрегирования уже имеющихся ограничений. Значение поля УсловнаяДлинна класса Вагон типа Double должно быть не меньше 0.5 условных вагонов. Описать ограничение @DoubleMin для валидации поля УсловнаяДлинна. Продемонстрировать работу с ограничениями.
Задания по вариантам:
Описать класс Автомобиль. Значения поля РегистрационныйНомер класса Автомобиль должно быть размером точно 6 символов и иметь формат БЦЦЦББ (Б-буква, Ц-цифра). Создать новое ограничение для валидации поля РегистрационныйНомер путём агрегирования уже имеющихся ограничений. Значение поля ДатаВыпуса класса Автомобиль типа Date должно быть меньше поля ДатаРегистрации класса Автомобиль типа Date. Описать ограничение @AutoConstraint для валидации класса Автомобиль. Продемонстрировать работу с ограничениями.
Описать класс Станция. Значение поля Расписание типа список объектов класса СтрокаРасписанияПоезда содержит расписание поездов по станции в формате {Номер, ВремяПрибытия, ВремяОтправления}. Создать ограничение для валидации класса СтрокаРасписанияПоезда, проверяющее, что ВремяПрибытия меньше ВремяОтправления. Продемонстрировать работу с ограничением.
Описать класс Перегон. Значения поля ВремяХодаПассажирскогоПоезда должно быть меньше значения поля ВремяХодаГрузовогоПоезда. Создать ограничение для валидации класса Перегон. Продемонстрировать работу с ограничением.
Описать класс Парк. Поезд может быть принят в любой парк, поэтому предусматривается приоритетность приёма поезда в парк, для этого используются поля ПриоритетПриёмаТранзитногоПоезда и ПриоритетПриёмаПоездаВРасформирование. Создать ограничение для валидации класса Парк, которое проверяет, что одновременно значение этих полей не равно нулю. Продемонстрировать работу с ограничением.
Описать класс СтанционныйПуть. Поле Специализация класса СтанционныйПуть должно принимать одно из трёх значений: 0 - неопределенно, 18 - главный путь, 99 - подъездной путь. Описать ограничение @IncludeElement, проверяющее наличие значение в заданном множестве. Валидировать поле Специализация. Продемонстрировать работу с ограничением.
Описать класс Состав. Поле ДлинаВУсловныхВагонах содержит длину поезда, а поле СписокВагонов содержит объекты типа Вагон, и по этому списку можно также вычислить длину поезда. Описать ограничение, проверяющие равенство значения поля ДлинаВУсловныхВагонах и значение длины, вычисленное по списку вагонов. Продемонстрировать работу с ограничением.
Описать класс Поезд. Класс поезд содержит поле Расписание и поле Маршрут, каждое из этих полей содержит список объектов, включающих в качестве поля ЕСР стации. Описать ограничение, проверяющие соответствие расписания поезда его маршруту. Продемонстрировать работу с ограничением.
Описать класс Локомотив. С локомотивом периодически проводится ТО. Пробег до следующего ТО измеряется по времени в часах поле ПробегВЧасах и по пути в километрах ПробегВКилометрах. Описать ограничение, которое проверяет, что если одно из значение поля ПробегВЧасах нулевое, то и значение поля ПробегВКилометрах также нулевое. Продемонстрировать работу с ограничением.
Описать класс БригадаТехническогоОсмотра. Значение поля НачалоТО типа Date должно быть меньше поля ОкончаниеТО типа Date. Описать ограничение для класса БригадаТехническогоОсмотра. Продемонстрировать работу с ограничением.
Описать класс ЛокомотивнаяБригада. Значение поля ЯвкаБригады типа Date должно быть меньше поля ВремяПриёмкиЛокомотива типа Date. Описать ограничение для класса ЛокомотивнаяБригада. Продемонстрировать работу с ограничением.
Описать класс ПутьПерегона. Поле ДлинаВМетрах содержит длину пути перегона, а поле СписокБлокУчастков содержит объекты типа БлокУчасток, и по этому списку можно также вычислить длину перегона. Описать ограничение, проверяющие равенство значения поля ДлинаВМетрах и значение длины, вычисленное по списку блокучастков. Продемонстрировать работу с ограничением.
Описать класс Компьютер. Поле ТипПроцессора и СокетМатеринскойПлаты должны проверяться на совместимость. Описать ограничение, проверяющие совместимость. Продемонстрировать работу с ограничением.
Описать класс Магазин. Поле КоличествоЕдиницПродуктаПоставленого содержит количество единиц определённого продукта, доставленного в магазин на реализацию, а поле КоличествоЕдиницПродуктаПродано содержит количество проданных единиц определённого продукта. Описать ограничение, проверяющие что КоличествоЕдиницПродуктаПродано не превышает КоличествоЕдиницПродуктаПоставленого. Продемонстрировать работу с ограничением.
Описать класс НаселённыйПункт. Поле КоличествоЧеловек содержит количество человек в населённом пункте, поле Площадь содержит количество квадратных километров, поле ПлотностьНаселения содержит количество человек на квадратный километр. Описать ограничение, проверяющие что ПлотностьНаселения соответствует делению КоличествоЧеловек на Площадь. Продемонстрировать работу с ограничением.
Описать класс Университет. Поле КоличествоОбучающихсяСтудентов содержит количество студентов в университете, поле ВместимостьАудиторий содержит количество студентов способных одномоментно обучатся в аудиториях университета. Описать ограничение, проверяющие не превышение КоличествоОбучающихсяСтудентов над произведением ВместимостьАудиторий на 3. Продемонстрировать работу с ограничением.
Описать класс Деканат. Поле КоличествоКафедр содержит количество кафедр, относящихся к деканату, поле КоличествоПреподавателей содержит количество преподавателей, относящихся к деканату. Описать ограничение, проверяющее что частное от деления КоличествоПреподавателей на КоличествоКафедр не меньше 3. Продемонстрировать работу с ограничением.
Описать класс Кафедра. Поле КоличествоДисциплин содержит количество предметов, преподаваемых на кафедре, поле КоличествоПреподавателей содержит количество преподавателей. Описать ограничение, проверяющие что частное от деления КоличествоДисциплин на КоличествоПреподавателей не превышает 5. Продемонстрировать работу с ограничением.
Описать класс Клиент. Поле СписокПродуктов содержит объекты типа Продукт, для которых указаны Наименование и Цена в некоторых единицах, поле КредитДоверия содержит количество единиц, в пределах которых должна находится суммарная цена всех покупок. Описать ограничение, проверяющие что суммарная цена всех покупок не превышает КредитДоверия. Продемонстрировать работу с ограничением.
Описать класс ЖелезнаяДорога. Поле СписокРайоновУправления содержит объекты типа РайонУправленияЖД. Описать ограничение, проверяющие что все районы управления объединены между собой смежными станциями или перегонами. Продемонстрировать работу с ограничением.
Описать класс РайонУправленияЖД. Поле СписокДиспетчерскихУчастков содержит объекты типа ДиспетчерскийУчастокЖД. Описать ограничение, проверяющие что все диспетчерские участки объединены между собой смежными станциями или перегонами. Продемонстрировать работу с ограничением.
Описать класс ДиспетчерскийУчастокЖД. Поле СписокСтанций объекты типа Станция, поле СписокПерегонов содержит объекты типа Перегон. Описать ограничение, проверяющие что все перегоны и все станции из списков соединены между собой. Продемонстрировать работу с ограничением.
Описать класс ЗаправочнаяСтанция. Поле ТекущееКоличествоБензина содержит количество бензина в ёмкостях заправочной станции, поле ЁмкостьЗаправочнойСтанции содержит суммарную вместимость всех емкостей. Описать ограничение, проверяющие что ТекущееКоличествоБензина не превышает ЁмкостьЗаправочнойСтанции. Продемонстрировать работу с ограничением.
Описать класс ПунктТехническогоОсмотра. Поле СписокБригад содержит объекты типа БригадаПТО, БригадаПТО содержит поле СписокПутей, поле СписокПутейОбслуживания содержит список станционных путей, которые обслуживаются ПТО. Описать ограничение, проверяющие что в СписокПутейОбслуживания входят все пути, которые обслуживаются бригадами. Продемонстрировать работу с ограничением.
Описать класс Вокзал. Поле КоличествоПутейОтправления содержит количество путей, принадлежащих вокзалу, поле Расписание содержит времена отправления поездов с вокзала. Описать ограничение, проверяющие что количество поездов, отправляющихся согласно расписания с вокзала в течении часа не превышает количество принадлежащих вокзалу путей. Продемонстрировать работу с ограничением.
Описать класс Аэропорт. Поле КоличествоТерминалов содержит количество терминалов, поле РасписаниеАвиарейсов содержит времена вылета самолётов. Описать ограничение, проверяющие что количество вылетов самолётов в течении часа не превышает количество терминалов. Продемонстрировать работу с ограничением.
Описать класс МорскойПорт. Поле КоличествоПристаней содержит количество пристаней порта, поле Расписание содержит времена отплытия кораблей. Описать ограничение, проверяющие что количество отплытий кораблей в течении суток не превышает количество пристаней. Продемонстрировать работу с ограничением.
Описать класс Самолёт. Поле Габариты содержит длину, ширину и высоту посадочной части самолёта, поле КоличествоПосадочныхМест содержит количество посадочных мест. Описать ограничение, проверяющие что КоличествоПосадочныхМест не превышает габариты. Продемонстрировать работу с ограничением.
Описать класс Корабль. Поле Водоизмещение содержит величину водоизмещения, поле Грузоподъёмность содержит вес груза, поле ВесСудна содержит величину веса судна. Описать ограничение, проверяющие что Грузоподъёмность не превышает разницу между Водоизмещение и ВесСудна. Продемонстрировать работу с ограничением.
Описать класс Космопорт. Поле ГабаритыСтартовогоКомплекса содержит длину, ширину и высоту стартового комплекса, поле ГабаритыКосмическогоКорабля содержит длину, ширину и высоту космического корабля. Описать ограничение, проверяющие что ГабаритыКосмическогоКорабля соответствует ГабаритыСтартовогоКомплекса. Продемонстрировать работу с ограничением.
Описать класс КосмическийКорабль. Поле ОбъёмЖилогоПомещения содержит объём жилого помещения, поле ГабаритыКосмическогоКорабля содержит длину, ширину и высоту космического коробля. Описать ограничение, проверяющие что ОбъёмЖилогоПомещения не превышает ГабаритыКосмическогоКорабля. Продемонстрировать работу с ограничением.
Описать класс Робот. Поле ОбъёмКонтейнера содержит величину объёма контейнера для мусора, поле Габариты содержит длину, ширину и высоту робота. Описать ограничение, проверяющие что ОбъёмКонтейнера не превышает Габариты. Продемонстрировать работу с ограничением.
Описать класс Смартфон. Поле ПлощадьЭкрана содержит величину площади экрана, поля Длина и Ширина содержат соответственно длину и ширину смартфона. Описать ограничение, проверяющие что ПлощадьЭкрана не превышает габариты смартфона. Продемонстрировать работу с ограничением.
Описать класс Кафе. Поле КоличествоСмен содержит количество смен персонала, поле КоличествоПерсонала содержит количество персонала (в одной смене минимум должен быть повар и официант). Описать ограничение, проверяющие что КоличествоПерсонала достаточно для КоличествоСмен. Продемонстрировать работу с ограничением.
Описать класс Дача. Поле ПлощадьДома содержит площадь строения, поле ПлощадьУчастка содержит площадь участка. Описать ограничение, проверяющие что ПлощадьДома не превышает ПлощадьУчастка. Продемонстрировать работу с ограничением.
Удобный способ создания новых ограничений — агрегирование (объединение) уже имеющихся. В таком случае мы обходимся без класса реализации. Это совсем не сложно сделать, если имеющиеся ограничения обладают @Target(ElementType.ANNOTATION_TYPE), то есть при работе с ними одна аннотация может быть применена к другой. Такой подход называется «объединением ограничений» и позволяет создавать высокоуровневые ограничения.
Задания по вариантам:
Описать класс Вагон. Значение поля ЕСР класса Вагон должно быть размером точно 6 символов и каждый символ обязательно должен быть цифрой. Создать новое ограничение для валидации поля ЕСР путём агрегирования уже имеющихся ограничений. Значение поля УсловнаяДлинна класса Вагон типа Double должно быть не меньше 0.5 условных вагонов. Описать ограничение @DoubleMin для валидации поля УсловнаяДлинна. Продемонстрировать работу с ограничениями.
Описать класс Автомобиль. Значения поля РегистрационныйНомер класса Автомобиль должно быть размером точно 6 символов и иметь формат БЦЦЦББ (Б-буква, Ц-цифра). Создать новое ограничение для валидации поля РегистрационныйНомер путём агрегирования уже имеющихся ограничений. Значение поля ДатаВыпуса класса Автомобиль типа Date должно быть меньше поля ДатаРегистрации класса Автомобиль типа Date. Описать ограничение @AutoConstraint для валидации класса Автомобиль. Продемонстрировать работу с ограничениями.
Описать класс Станция. Значение поля Расписание типа список объектов класса СтрокаРасписанияПоезда содержит расписание поездов по станции в формате {Номер, ВремяПрибытия, ВремяОтправления}. Создать ограничение для валидации класса СтрокаРасписанияПоезда, проверяющее, что ВремяПрибытия меньше ВремяОтправления. Продемонстрировать работу с ограничением.
Описать класс Перегон. Значения поля ВремяХодаПассажирскогоПоезда должно быть меньше значения поля ВремяХодаГрузовогоПоезда. Создать ограничение для валидации класса Перегон. Продемонстрировать работу с ограничением.
Описать класс Парк. Поезд может быть принят в любой парк, поэтому предусматривается приоритетность приёма поезда в парк, для этого используются поля ПриоритетПриёмаТранзитногоПоезда и ПриоритетПриёмаПоездаВРасформирование. Создать ограничение для валидации класса Парк, которое проверяет, что одновременно значение этих полей не равно нулю. Продемонстрировать работу с ограничением.
Описать класс СтанционныйПуть. Поле Специализация класса СтанционныйПуть должно принимать одно из трёх значений: 0 - неопределенно, 18 - главный путь, 99 - подъездной путь. Описать ограничение @IncludeElement, проверяющее наличие значение в заданном множестве. Валидировать поле Специализация. Продемонстрировать работу с ограничением.
Описать класс Состав. Поле ДлинаВУсловныхВагонах содержит длину поезда, а поле СписокВагонов содержит объекты типа Вагон, и по этому списку можно также вычислить длину поезда. Описать ограничение, проверяющие равенство значения поля ДлинаВУсловныхВагонах и значение длины, вычисленное по списку вагонов. Продемонстрировать работу с ограничением.
Описать класс Поезд. Класс поезд содержит поле Расписание и поле Маршрут, каждое из этих полей содержит список объектов, включающих в качестве поля ЕСР стации. Описать ограничение, проверяющие соответствие расписания поезда его маршруту. Продемонстрировать работу с ограничением.
Описать класс Локомотив. С локомотивом периодически проводится ТО. Пробег до следующего ТО измеряется по времени в часах поле ПробегВЧасах и по пути в километрах ПробегВКилометрах. Описать ограничение, которое проверяет, что если одно из значение поля ПробегВЧасах нулевое, то и значение поля ПробегВКилометрах также нулевое. Продемонстрировать работу с ограничением.
Описать класс БригадаТехническогоОсмотра. Значение поля НачалоТО типа Date должно быть меньше поля ОкончаниеТО типа Date. Описать ограничение для класса БригадаТехническогоОсмотра. Продемонстрировать работу с ограничением.
Описать класс ЛокомотивнаяБригада. Значение поля ЯвкаБригады типа Date должно быть меньше поля ВремяПриёмкиЛокомотива типа Date. Описать ограничение для класса ЛокомотивнаяБригада. Продемонстрировать работу с ограничением.
Описать класс ПутьПерегона. Поле ДлинаВМетрах содержит длину пути перегона, а поле СписокБлокУчастков содержит объекты типа БлокУчасток, и по этому списку можно также вычислить длину перегона. Описать ограничение, проверяющие равенство значения поля ДлинаВМетрах и значение длины, вычисленное по списку блокучастков. Продемонстрировать работу с ограничением.