Sistema de Empréstimos
Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy — lição 79 de 87.
Desafio
FácilVamos continuar construindo o Sistema de Gerenciamento de Biblioteca criando um sistema de empréstimo adequado com uma classe Library que gerencia a coleção de livros e usuários. É aqui que seu sistema começa a parecer uma biblioteca real — rastreando quem está com o quê e aplicando as regras de empréstimo!
Você organizará seu código em quatro arquivos:
Book.java: Mantenha sua classe Book do desafio anterior com toda a sua funcionalidade — isbn, title, author, isAvailable, borrowedBy, getDetails() e os getters/setters apropriados.User.java: Mantenha sua classe User com id, name, o ArrayList borrowedBooks, borrowBook(), returnBook(), getBorrowedCount() e toString().Library.java: Crie a classe centralLibraryque gerencia tudo. Sua biblioteca deve manter dois ArrayLists — um para objetosBooke outro para objetosUser. Inclua estes métodos:addBook(Book book)- adiciona um livro à coleção da biblioteca.registerUser(User user)- adiciona um usuário aos usuários registrados da biblioteca.findBookByIsbn(String isbn)- pesquisa nos livros e retorna o Book com o ISBN correspondente, ounullse não for encontrado.findUserById(String id)- pesquisa nos usuários e retorna o User com o ID correspondente, ounullse não for encontrado.borrowBook(String userId, String isbn)- encontra o usuário e o livro, então, se ambos existirem e o livro estiver disponível, faz o usuário emprestar o livro e imprime[userName] borrowed [bookTitle]. Se o livro não estiver disponível, imprimeBook not available. Se o usuário ou livro não for encontrado, imprimeInvalid user or book.returnBook(String userId, String isbn)- encontra o usuário e o livro, então faz o usuário devolver o livro e imprime[userName] returned [bookTitle]. Se o usuário ou livro não for encontrado, imprimeInvalid user or book.Main.java: Reúna seu sistema de biblioteca! Você receberá entradas para dois livros (ISBN, título, autor cada), um usuário (ID, nome) e, em seguida, uma série de operações.Crie uma Library, adicione ambos os livros e registre o usuário. Em seguida, processe as operações — você receberá uma string separada por vírgulas onde cada operação é formatada como
borrow:userId:isbnoureturn:userId:isbn.Após processar todas as operações, imprima um resumo mostrando o status de cada livro no formato
[isbn]: [Available/Borrowed].
Você receberá as entradas nesta ordem: book1 ISBN, book1 title, book1 author, book2 ISBN, book2 title, book2 author, user ID, user name e, finalmente, a string de operações.
Por exemplo, com as entradas ISBN-001, Clean Code, Robert Martin, ISBN-002, Design Patterns, Gang of Four, U001, Alice, e borrow:U001:ISBN-001,borrow:U001:ISBN-002,return:U001:ISBN-001, sua saída seria:
Alice borrowed Clean Code
Alice borrowed Design Patterns
Alice returned Clean Code
ISBN-001: Available
ISBN-002: BorrowedEste desafio reúne composição, encapsulamento e design de métodos para criar um sistema coeso. A classe Library atua como uma coordenadora, delegando a lógica real de empréstimo para as classes User e Book enquanto gerencia a coleção geral!
Experimente você mesmo
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Ler informações do livro 1
String isbn1 = scanner.nextLine();
String title1 = scanner.nextLine();
String author1 = scanner.nextLine();
// Ler informações do livro 2
String isbn2 = scanner.nextLine();
String title2 = scanner.nextLine();
String author2 = scanner.nextLine();
// Ler informações do usuário
String userId = scanner.nextLine();
String userName = scanner.nextLine();
// Ler string de operações (separada por vírgulas, formato: borrow:userId:isbn ou return:userId:isbn)
String operationsStr = scanner.nextLine();
// TODO: Criar objetos Book para book1 e book2
// TODO: Criar um objeto User
// TODO: Criar uma Library, adicionar ambos os livros e registrar o usuário
// TODO: Dividir operationsStr por "," e processar cada operação
// Para cada operação, dividir por ":" para obter action, userId, isbn
// Chamar library.borrowBook() ou library.returnBook() adequadamente
// TODO: Imprimir o resumo de cada livro no formato "[isbn]: [Available/Borrowed]"
}
}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 Validado13Projeto: Gerenciamento de Biblioteca
Visão Geral do Projeto e Modelagem UMLClasses Livro e Usuário2Modificadores 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