Classes Livro e Usuário
Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy — lição 78 de 87.
Desafio
FácilVamos continuar construindo o Sistema de Gerenciamento de Biblioteca expandindo as classes Book e User da lição anterior. Agora você adicionará a capacidade de os usuários pegarem livros emprestados, criando uma conexão real entre essas duas entidades.
Você organizará seu código em três arquivos:
Book.java: Aprimore sua classe Book do desafio anterior. Mantenha toda a funcionalidade existente (isbn, title, author, isAvailable com getters/setters egetDetails()). Agora adicione um campo privadoborrowedBydo tipoStringque armazena o ID do usuário que pegou o livro emprestado (ounullse não estiver emprestado). Adicione um getter paraborrowedBye um setter que também atualizeisAvailableadequadamente—quando um livro é emprestado (borrowedBy é definido com um valor não nulo), ele se torna indisponível; quando devolvido (definido como null), ele se torna disponível novamente.User.java: Expanda sua classe User para rastrear livros emprestados. Mantenha os campos id, name, construtor, getters etoString()existentes. Adicione um campo privadoArrayList<Book>chamadoborrowedBooks(inicialize-o no construtor). Crie um métodoborrowBook(Book book)que adiciona o livro à lista do usuário e define oborrowedBydo livro como o ID deste usuário. Crie um métodoreturnBook(Book book)que remove o livro da lista e defineborrowedBycomo null. Adicione um métodogetBorrowedCount()que retorna quantos livros o usuário possui atualmente.Main.java: Demonstre o sistema de empréstimo em ação. Você receberá cinco entradas: ISBN, título, autor de um livro, e depois o ID e o nome do usuário.Crie um Book e um User com essas entradas. Imprima os detalhes do livro e o status de disponibilidade. Em seguida, faça o usuário pegar o livro emprestado. Imprima a disponibilidade do livro novamente, seguida por quem o pegou emprestado no formato
Borrowed by: [userId]. Imprima quantos livros o usuário possui no formato[name] has [count] book(s). Por fim, faça o usuário devolver o livro e imprima a disponibilidade mais uma vez.
Você receberá cinco entradas em ordem: ISBN (String), title (String), author (String), user ID (String) e user name (String).
Por exemplo, com as entradas 978-0-13-468599-1, Effective Java, Joshua Bloch, U001 e Alice, sua saída seria:
[978-0-13-468599-1] Effective Java by Joshua Bloch
Available: true
Available: false
Borrowed by: U001
Alice has 1 book(s)
Available: trueEste desafio baseia-se diretamente no seu trabalho anterior, adicionando o relacionamento crucial entre livros e usuários que torna um sistema de biblioteca funcional. Você usará composição (User "tem" Books) e verá como as mudanças em um objeto podem afetar outro por meio de métodos bem projetados!
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
String isbn = scanner.nextLine();
String title = scanner.nextLine();
String author = scanner.nextLine();
// Ler informações do usuário
String userId = scanner.nextLine();
String userName = scanner.nextLine();
// Criar um objeto Book com isbn, title e author
Book book = new Book(isbn, title, author);
// Criar um objeto User com userId e userName
User user = new User(userId, userName);
// Imprimir os detalhes do livro usando getDetails()
System.out.println(book.getDetails());
// Imprimir se o livro está disponível (formato: "Available: true" ou "Available: false")
System.out.println("Available: " + book.isAvailable());
// Fazer o usuário pegar o livro emprestado
user.borrowBook(book);
// Imprimir a disponibilidade do livro novamente
System.out.println("Available: " + book.isAvailable());
// Imprimir quem o pegou emprestado
System.out.println("Borrowed by: " + book.getBorrowedBy());
// Imprimir quantos livros o usuário possui
System.out.println(user.getName() + " has " + user.getBorrowedCount() + " book(s)");
// Fazer o usuário devolver o livro
user.returnBook(book);
// Imprimir a disponibilidade mais uma vez
System.out.println("Available: " + book.isAvailable());
}
}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