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 criando o Sistema de Gerenciamento de Biblioteca, desenvolvendo um sistema adequado de empréstimos com uma classe Library que gerencia a coleção de livros e usuários. É aqui que seu sistema começa a parecer uma biblioteca de verdade: acompanhando quem está com cada item 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 todas as suas funcionalidades: isbn, title, author, isAvailable, borrowedBy, getDetails() e os getters/setters apropriados.User.java: Mantenha sua classe User com id, name, o borrowedBooks ArrayList, 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 entre os livros e retorna o Book com o ISBN correspondente, ounullse não for encontrado.findUserById(String id)- pesquisa entre os 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 pegar o livro emprestado e imprime[userName] borrowed [bookTitle]. Se o livro não estiver disponível, imprimaBook not available. Se o usuário ou o livro não for encontrado, imprimaInvalid 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 o livro não for encontrado, imprimaInvalid user or book.Main.java: Reúna seu sistema de biblioteca! Você receberá os dados de entrada de dois livros (ISBN, título e autor de cada um), de um usuário (ID e nome) e, em seguida, uma série de operações.Crie uma Library, adicione os dois livros e registre o usuário. Em seguida, processe as operações: você receberá uma string separada por vírgulas, em que cada operação terá o formato
borrow:userId:isbnoureturn:userId:isbn.Depois de processar todas as operações, imprima um resumo mostrando o status de cada livro no formato
[isbn]: [Available/Borrowed].
Você receberá os dados de entrada nesta ordem: ISBN de book1, título de book1, autor de book1, ISBN de book2, título de book2, autor de book2, ID do usuário, nome do usuário e, por fim, 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 criação de métodos para desenvolver um sistema coeso. A classe Library atua como uma coordenadora, delegando a lógica efetiva de empréstimo às classes User e Book enquanto gerencia a coleção como um todo!
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 (separadas por vírgula, 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() conforme o caso
// TODO: Imprimir resumo para 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árioSistema de EmpréstimosFuncionalidade de BuscaInterface do AdministradorIntegração de Tratamento de ExceçõesTestes e Integração2Modificadores 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 IteratorPratique por conta própria: Compilador de Java online