Повторение — Validated User
Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy — урок 63 из 87.
Задание
ЛегкоДавайте создадим полноценную систему регистрации пользователей, которая проверяет входные данные и использует пользовательские исключения, чтобы точно сообщить, что пошло не так! Вы объедините все знания из этой главы: пользовательские проверяемые (checked) и непроверяемые (unchecked) исключения, иерархию исключений и конструкцию try-with-resources с автоматически закрываемым валидатором.
Вы распределите свой код по пяти файлам:
ValidationException.java: Создайте проверяемое исключение, которое будет служить базовым для всех ошибок валидации. Это исключение должно расширятьExceptionи включать конструктор, принимающий сообщение.InvalidUsernameException.java: Создайте проверяемое исключение для ошибок валидации имени пользователя. Оно должно расширять ваш классValidationException, создавая небольшую иерархию исключений. Включите конструктор, который принимает сообщение и передает его родителю.InvalidAgeException.java: Создайте непроверяемое исключение для ошибок, связанных с возрастом (например, отрицательный возраст, что представляет собой программную ошибку). Оно должно расширятьRuntimeExceptionи иметь конструктор, принимающий сообщение.UserValidator.java: Создайте класс, реализующийAutoCloseable, чтобы имитировать сессию валидации, которая должна быть правильно закрыта. Ваш валидатор должен:Выводить
Validator session startedв конструкторе.Иметь метод
validateUsername(String username), который выбрасываетInvalidUsernameException, если имя пользователя равно null, пустое или короче 3 символов (с сообщением"Username must be at least 3 characters"). В противном случае выводитьUsername '[username]' is valid.Иметь метод
validateAge(int age), который выбрасываетInvalidAgeException, если возраст отрицательный (с сообщением"Age cannot be negative: [age]"). Если возраст меньше 13, выбрасыватьValidationExceptionс сообщением"Must be at least 13 years old". В противном случае выводитьAge [age] is valid.Реализовать метод
close(), который выводитValidator session closed.Main.java: Объедините вашу систему валидации! Вы получите два входных значения: имя пользователя (String) и возраст (integer).Используйте try-with-resources для создания
UserValidator. Внутри блока try сначала проверьте имя пользователя, затем проверьте возраст. Если обе проверки пройдены, выведитеUser registration successful!Перехватите
InvalidUsernameExceptionи выведитеUsername error: [message]. ПерехватитеInvalidAgeExceptionи выведитеAge error: [message]. ПерехватитеValidationException(родительский класс) и выведитеValidation error: [message].Валидатор должен автоматически закрываться независимо от того, прошла валидация успешно или нет!
Вы получите два входных значения по порядку: имя пользователя (String) и возраст (integer).
Эта задача объединяет всю главу: вы построите иерархию исключений с ValidationException в качестве родителя, будете уместно использовать как проверяемые, так и непроверяемые исключения, и обеспечите своевременную очистку ресурса валидатора с помощью try-with-resources. Обратите внимание, как перехват родительского ValidationException после его дочернего InvalidUsernameException позволяет сначала обрабатывать специфические случаи, при этом все равно отлавливая другие ошибки валидации!
Попробуйте сами
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Чтение входных данных
String username = scanner.nextLine();
int age = scanner.nextInt();
// TODO: Используйте try-with-resources для создания UserValidator
// Внутри блока try:
// 1. Проверьте username
// 2. Проверьте age
// 3. Если оба условия пройдены, выведите "User registration successful!"
// TODO: Перехватите InvalidUsernameException и выведите "Username error: [message]"
// TODO: Перехватите InvalidAgeException и выведите "Age error: [message]"
// TODO: Перехватите ValidationException (parent) и выведите "Validation error: [message]"
// Note: Валидатор должен закрываться автоматически независимо от успеха или неудачи!
}
}
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово thisМетодыПоля (атрибуты)Метод-конструкторПерегрузка конструкторовИтоги — Простой калькулятор4Наследование
Основы наследования (extends)Ключевое слово superПереопределение методов (@Override)Цепочка конструкторовКласс ObjectОдиночное и многоуровневое наследованиеПочему нет множественного наследования классовИтоги — Иерархия сотрудников7Специальные методы и класс Object
Метод toString()equals() и hashCode()Метод clone()compareTo() и ComparableИнтерфейс ComparatorПовторение — Кастомная сортировка10Обработка исключений в ООП
Иерархия классов исключенийПользовательские исключенияПроверяемые и непроверяемые ошибкиПаттерн Try With ResourcesПовторение — Validated User2Модификаторы доступа и инкапсуляция
Обзор уровней доступаМетоды геттеры и сеттерыСокрытие данныхКлючевое слово finalИтоги — Менеджер банковского счета5Полиморфизм
Основы перегрузки методовПереопределение методов (Run-Time)Upcasting и DowncastingОператор instanceofАбстрактные классы и методыИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция против наследованияАгрегация против композицииВнутренние, вложенные и анонимные классыEnums и методы перечисленийRecords (Java 16+)Sealed-классы (Java 17+)11Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн BuilderПаттерн ObserverПаттерн Strategy3Свойства класса и статические члены
Переменные экземпляра и статические переменныеСтатические методыСтатические блокиКонстанты (static final)Итоги: Счетчик и утилиты6Интерфейсы и абстрактные классы
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовDefault и Static методы в интерфейсахАбстрактные классы vs ИнтерфейсыФункциональные интерфейсыИтоги — Платежная система9Обобщения
Введение в обобщенияОбобщенные классыОбобщенные методыОграниченные параметры типаСимволы подстановки (Wildcards: ?, extends, super)Итоги — Обобщенный контейнер12Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»Паттерн «Итератор»