Recapitulação - Usuário Validado
Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy — lição 63 de 87.
Desafio
FácilVamos construir um sistema completo de registro de usuários que valida os dados de entrada e usa exceções personalizadas para comunicar exatamente o que deu errado! Você combinará tudo deste capítulo: exceções personalizadas verificadas (checked) e não verificadas (unchecked), a hierarquia de exceções e o try-with-resources com um validador auto-closeable.
Você organizará seu código em cinco arquivos:
ValidationException.java: Crie uma exceção verificada que sirva como base para todos os erros de validação. Esta exceção deve estenderExceptione incluir um construtor que aceite uma mensagem.InvalidUsernameException.java: Crie uma exceção verificada para falhas de validação de nome de usuário. Esta deve estender sua classeValidationException, criando uma pequena hierarquia de exceções. Inclua um construtor que aceite uma mensagem e a passe para o pai.InvalidAgeException.java: Crie uma exceção não verificada para erros relacionados à idade (como idades negativas, que representam erros de programação). Esta deve estenderRuntimeExceptioncom um construtor que aceite uma mensagem.UserValidator.java: Crie uma classe que implementeAutoCloseablepara simular uma sessão de validação que deve ser fechada adequadamente. Seu validador deve:Imprimir
Validator session startedno construtor.Ter um método
validateUsername(String username)que lançaInvalidUsernameExceptionse o nome de usuário for nulo, vazio ou tiver menos de 3 caracteres (com a mensagem"Username must be at least 3 characters"). Caso contrário, imprimaUsername '[username]' is valid.Ter um método
validateAge(int age)que lançaInvalidAgeExceptionse a idade for negativa (com a mensagem"Age cannot be negative: [age]"). Se a idade for inferior a 13 anos, lanceValidationExceptioncom a mensagem"Must be at least 13 years old". Caso contrário, imprimaAge [age] is valid.Implementar
close()para imprimirValidator session closed.Main.java: Reúna seu sistema de validação! Você receberá duas entradas: um nome de usuário (String) e uma idade (inteiro).Use try-with-resources para criar um
UserValidator. Dentro do bloco try, primeiro valide o nome de usuário e depois valide a idade. Se ambos passarem, imprimaUser registration successful!Capture
InvalidUsernameExceptione imprimaUsername error: [message]. CaptureInvalidAgeExceptione imprimaAge error: [message]. CaptureValidationException(o pai) e imprimaValidation error: [message].O validador deve fechar automaticamente, independentemente de a validação ser bem-sucedida ou falhar!
Você receberá duas entradas em ordem: nome de usuário (String) e idade (inteiro).
Este desafio reúne todo o capítulo: você construirá uma hierarquia de exceções com ValidationException como pai, usará exceções verificadas e não verificadas apropriadamente e garantirá que seu recurso validador seja sempre limpo com try-with-resources. Observe como capturar a classe pai ValidationException após sua filha InvalidUsernameException permite que você lide com casos específicos primeiro, enquanto ainda captura outros erros de validação!
Experimente você mesmo
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Lê as entradas
String username = scanner.nextLine();
int age = scanner.nextInt();
// TODO: Use try-with-resources para criar um UserValidator
// Dentro do bloco try:
// 1. Valide o username
// 2. Valide a age
// 3. Se ambos passarem, imprima "User registration successful!"
// TODO: Capture InvalidUsernameException e imprima "Username error: [message]"
// TODO: Capture InvalidAgeException e imprima "Age error: [message]"
// TODO: Capture ValidationException (pai) e imprima "Validation error: [message]"
// Note: O validador deve fechar automaticamente, independentemente do sucesso ou falha!
}
}
Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosA Palavra-chave thisMétodosCampos (Atributos)Método ConstrutorSobrecarga de ConstrutorRecapitulação - Calculadora Simples4Herança
Herança Básica (extends)A Palavra-chave superSobrescrita de Método (@Override)Encadeamento de ConstrutoresA Classe ObjectHerança Simples e MultinívelPor que não há Herança Múltipla de ClassesRecapitulação - Hierarquia de Funcionários7Métodos Especiais e a Classe Object
Método toString()equals() e hashCode()Método clone()compareTo() e ComparableInterface ComparatorRecapitulação - Ordenação Personalizada10Tratamento de Exceções em POO
Hierarquia de Classes de ExceçãoExceções PersonalizadasErros Checked vs UncheckedPadrão Try With ResourcesRecapitulação - Usuário Validado2Modificadores de Acesso e Encapsulamento
Visão Geral dos Níveis de AcessoMétodos Getter e SetterOcultação de InformaçõesA Palavra-chave finalRecapitulação - Gerenciador de Conta Bancária5Polimorfismo
Fundamentos de Sobrecarga de MétodosSobrescrita de Métodos (Tempo de Execução)Upcasting e DowncastingO Operador instanceofClasses e Métodos AbstratosRecapitulação - Calculadora de Formas8Conceitos Avançados de OOP
Composição vs HerançaAgregação vs ComposiçãoClasses Internas, Aninhadas e AnônimasEnums e Métodos de EnumRecords (Java 16+)Classes Seladas (Java 17+)11Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão BuilderPadrão ObserverPadrão Strategy3Propriedades de Classe e Membros Estáticos
Variáveis de Instância vs EstáticasMétodos EstáticosBlocos EstáticosConstantes (static final)Recapitulação - Contador e Utilitário6Interfaces e Classes Abstratas
Introdução às InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesDefault e Static em InterfacesClasses Abstratas vs InterfacesInterfaces FuncionaisRecapitulação - Sistema de Pagamento9Generics
Introdução a GenericsClasses GenéricasMétodos GenéricosParâmetros de Tipos DelimitadosWildcards (?, extends, super)Recapitulação - Container Genérico12Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Iterator