Crie um sistema de biblioteca considerando as recomendações abaixo:
Classe Livro:
Atributos: Título, Autores, Area, Editora, Ano, Edição, Número de Folhas.
Métodos: set’s e get’s
Classe Usuário:
Atributos: Nome, Idade, Sexo, Telefone, Matricula.
Métodos: set’s e get’s
Classe Empréstimo
Atributos: Data do Empréstimo, Hora do Empréstimo, data limite de entrega, Livro e Usuário.
Classe Biblioteca:
Atributos: ArrayList de livros e ArrayList de empréstimos.
Métodos: cadastrar usuário, cadastrar livros, cadastrar empréstimo, exibir
Classe Livro:
Atributos: Título, Autores, Area, Editora, Ano, Edição, Número de Folhas.
Métodos: set’s e get’s
Classe Usuário:
Atributos: Nome, Idade, Sexo, Telefone, Matricula.
Métodos: set’s e get’s
Classe Empréstimo
Atributos: Data do Empréstimo, Hora do Empréstimo, data limite de entrega, Livro e Usuário.
Atributos: ArrayList de livros e ArrayList de empréstimos.
Métodos: cadastrar usuário, cadastrar livros, cadastrar empréstimo, exibir
Passo 1
O que o enunciado pede e quais informações ele dá.
- Pedidos do enunciado:
- Criar as classes: Livro, Usuário, Empréstimo e Biblioteca.
- Cada classe deve ter os atributos listados e métodos set’s e get’s (getters e setters).
- A classe Biblioteca deve ter ArrayList de livros e ArrayList de empréstimos.
- A Biblioteca deve oferecer os métodos: cadastrar usuário, cadastrar livros, cadastrar empréstimo e exibir.
- Informações fornecidas (atributos obrigatórios):
- Classe Livro: Título, Autores, Area, Editora, Ano, Edição, Número de Folhas.
- Classe Usuário: Nome, Idade, Sexo, Telefone, Matrícula.
- Classe Empréstimo: Data do Empréstimo, Hora do Empréstimo, data limite de entrega, Livro e Usuário.
- Classe Biblioteca: ArrayList de livros e ArrayList de empréstimos.
- Observações importantes:
- O enunciado pede explicitamente cadastro de usuário, então precisamos manter usuários em algum lugar — explicarei e implementarei isso na solução.
- Não foram fornecidos detalhes sobre devolução, quantidade de cópias ou disponibilidade de livros. Para criar um sistema funcional que evite emprestar um mesmo exemplar duas vezes, vou adicionar um campo técnico opcional para controlar disponibilidade do exemplar; isso será explicado nos passos seguintes.
Passo 2
Escolha do método de implementação (linguagem e abordagem) e justificativa.
- Linguagem: vou usar Java porque o enunciado menciona ArrayList e conventions de getters/setters combinam bem com Java; é comum em disciplinas de exatas/POO.
- Estrutura:
- Cada classe será uma classe Java simples com atributos privados (encapsulamento) e getters/setters públicos.
- Para representarmos os autores de um livro, usarei um List<String> para permitir múltiplos autores.
- Para data e hora do empréstimo, usarei as classes do pacote java.time: LocalDate e LocalTime (mais claras e modernas).
- Biblioteca terá três listas: livros (ArrayList<Livro>), usuários (ArrayList<Usuario>) e empréstimos (ArrayList<Emprestimo>). Expliquei antes que o enunciado não explicitou lista de usuários, mas é necessário para cadastrar usuários e para registrar empréstimos corretamente.
- Vou incluir checagens básicas (por exemplo: não cadastrar livro duplicado, não cadastrar empréstimo se livro já estiver emprestado).
- Por que essas escolhas:
- Encapsulamento (atributos privados + getters/setters) facilita manutenção e validações.
- Listas permitem fácil iteração e busca.
- LocalDate/LocalTime evitam manipulações de strings e erros de parsing.
Passo 3
Definição detalhada da classe Livro: atributos, por que cada tipo e código de exemplo.
- Atributos e tipos escolhidos:
- Título: String — o nome do livro.
- Autores: List<String> — permite múltiplos autores e é fácil de manipular.
- Area: String — área temática (ex.: Matemática, Física).
- Editora: String — casa editorial.
- Ano: int — ano de publicação.
- Edição: int — número da edição.
- Número de Folhas: int — número de páginas/folhas.
- Opcional (adicionado por praticidade): disponibilidate/exemplar disponível: boolean — para controlar se o exemplar está emprestado. Expliquei antes que isso é um pequeno acréscimo para evitar dupla locação do mesmo exemplar único.
- Porque adicionar o campo booleano:
- Sem essa bandeira, não há forma simples de impedir que um mesmo objeto Livro seja emprestado múltiplas vezes sem modelar cópias; isso melhora a utilidade do sistema sem mudar os atributos principais exigidos.
- Código exemplo (esqueleto; getters e setters implementados):
public class Livro {
private String titulo;
private List<String> autores;
private String area;
private String editora;
private int ano;
private int edicao;
private int numeroFolhas;
private boolean disponivel; // atributo extra para controlar disponibilidade
public Livro(String titulo, List<String> autores, String area, String editora,
int ano, int edicao, int numeroFolhas) {
this.titulo = titulo;
this.autores = new ArrayList<>(autores);
this.area = area;
this.editora = editora;
this.ano = ano;
this.edicao = edicao;
this.numeroFolhas = numeroFolhas;
this.disponivel = true; // por padrão está disponível
}
// Getters e setters (exemplos)
public String getTitulo() { return titulo; }
public void setTitulo(String titulo) { this.titulo = titulo; }
public List<String> getAutores() { return new ArrayList<>(autores); }
public void setAutores(List<String> autores) { this.autores = new ArrayList<>(autores); }
public String getArea() { return area; }
public void setArea(String area) { this.area = area; }
public String getEditora() { return editora; }
public void setEditora(String editora) { this.editora = editora; }
public int getAno() { return ano; }
public void setAno(int ano) { this.ano = ano; }
public int getEdicao() { return edicao; }
public void setEdicao(int edicao) { this.edicao = edicao; }
public int getNumeroFolhas() { return numeroFolhas; }
public void setNumeroFolhas(int numeroFolhas) { this.numeroFolhas = numeroFolhas; }
public boolean isDisponivel() { return disponivel; }
public void setDisponivel(boolean disponivel) { this.disponivel = disponivel; }
@Override
public String toString() {
return "Livro{titulo='" + titulo + "', autores=" + autores + ", area='" + area +
"', editora='" + editora + "', ano=" + ano + ", edicao=" + edicao +
", numeroFolhas=" + numeroFolhas + ", disponivel=" + disponivel + "}";
}
}
- Observações didáticas:
- Uso de cópia defensiva em getters/setters de listas para evitar que código externo modifique a lista interna diretamente.
- toString facilita exibição.
Passo 4
Definição detalhada da classe Usuário: atributos, tipos, e código de exemplo.
- Atributos e tipos:
- Nome: String.
- Idade: int.
- Sexo: String (pode ser “M”, “F”, “Outro”, etc.); String é mais flexível que char.
- Telefone: String (porque pode conter símbolos).
- Matricula: String — identificador único do usuário na biblioteca.
- Código exemplo:
public class Usuario {
private String nome;
private int idade;
private String sexo;
private String telefone;
private String matricula;
public Usuario(String nome, int idade, String sexo, String telefone, String matricula) {
this.nome = nome;
this.idade = idade;
this.sexo = sexo;
this.telefone = telefone;
this.matricula = matricula;
}
// Getters e setters
public String getNome() { return nome; }
public void setNome(String nome) { this.nome = nome; }
public int getIdade() { return idade; }
public void setIdade(int idade) { this.idade = idade; }
public String getSexo() { return sexo; }
public void setSexo(String sexo) { this.sexo = sexo; }
public String getTelefone() { return telefone; }
public void setTelefone(String telefone) { this.telefone = telefone; }
public String getMatricula() { return matricula; }
public void setMatricula(String matricula) { this.matricula = matricula; }
@Override
public String toString() {
return "Usuario{nome='" + nome + "', idade=" + idade + ", sexo='" + sexo +
"', telefone='" + telefone + "', matricula='" + matricula + "'}";
}
}
- Observações didáticas:
- Matricula deve ser usada como chave única para buscar usuários ao cadastrar empréstimos.
- Poderíamos validar idade >= 0, formato de telefone etc., mas deixei simples para foco na estrutura.
Passo 5
Definição detalhada da classe Empréstimo: atributos, por que cada tipo e código.
- Atributos e tipos:
- Data do Empréstimo: LocalDate — somente a data.
- Hora do Empréstimo: LocalTime — hora do empréstimo.
- Data limite de entrega: LocalDate — data esperada de devolução.
- Livro: Livro — referência ao objeto Livro emprestado.
- Usuário: Usuario — referência ao usuário que pegou o livro.
- Observação: Também podemos incluir campo devolvido (boolean) ou dataDevolucao, caso queiramos controlar devoluções. Aqui implementarei um campo booleano opcional chamado devolvido para possibilitar devoluções no futuro.
- Código exemplo:
import java.time.LocalDate;
import java.time.LocalTime;
public class Emprestimo {
private LocalDate dataEmprestimo;
private LocalTime horaEmprestimo;
private LocalDate dataLimite;
private Livro livro;
private Usuario usuario;
private boolean devolvido;
public Emprestimo(LocalDate dataEmprestimo, LocalTime horaEmprestimo,
LocalDate dataLimite, Livro livro, Usuario usuario) {
this.dataEmprestimo = dataEmprestimo;
this.horaEmprestimo = horaEmprestimo;
this.dataLimite = dataLimite;
this.livro = livro;
this.usuario = usuario;
this.devolvido = false;
}
// Getters e setters
public LocalDate getDataEmprestimo() { return dataEmprestimo; }
public void setDataEmprestimo(LocalDate dataEmprestimo) { this.dataEmprestimo = dataEmprestimo; }
public LocalTime getHoraEmprestimo() { return horaEmprestimo; }
public void setHoraEmprestimo(LocalTime horaEmprestimo) { this.horaEmprestimo = horaEmprestimo; }
public LocalDate getDataLimite() { return dataLimite; }
public void setDataLimite(LocalDate dataLimite) { this.dataLimite = dataLimite; }
public Livro getLivro() { return livro; }
public void setLivro(Livro livro) { this.livro = livro; }
public Usuario getUsuario() { return usuario; }
public void setUsuario(Usuario usuario) { this.usuario = usuario; }
public boolean isDevolvido() { return devolvido; }
public void setDevolvido(boolean devolvido) { this.devolvido = devolvido; }
@Override
public String toString() {
return "Emprestimo{data=" + dataEmprestimo + ", hora=" + horaEmprestimo +
", dataLimite=" + dataLimite + ", livro=" + livro.getTitulo() +
", usuario=" + usuario.getNome() + ", devolvido=" + devolvido + "}";
}
}
- Observações didáticas:
- Usar referências (Livro e Usuario) significa que o empréstimo “aponta” para os objetos existentes nas listas da Biblioteca — isso é composição/associação em orientação a objetos.
- O campo devolvido permite futuramente implementar devolução que libera o livro.
Passo 6
Implementação da classe Biblioteca: listas, métodos de cadastro e exibição, e explicações de validação.
- Atributos:
- ArrayList<Livro> livros — catálogo de livros (conforme pedido).
- ArrayList<Emprestimo> emprestimos — histórico/registro de empréstimos (conforme pedido).
- Eu também adiciono ArrayList<Usuario> usuarios — necessário para cadastrar usuários e relacioná-los a empréstimos.
- Métodos (implementados com validações simples):
- cadastrarUsuario(Usuario u): adiciona usuário se matricula ainda não existir.
- cadastrarLivro(Livro l): adiciona livro se não houver exemplar igual (usarei comparação por título+editora+ano+edição).
- cadastrarEmprestimo(Usuario u, Livro l, LocalDate dataEmprestimo, LocalTime horaEmprestimo, LocalDate dataLimite):
- Verifica se usuário está cadastrado; se não, informa erro.
- Verifica se livro está cadastrado e disponível; se não, informa erro.
- Verifica se dataLimite é posterior ou igual à dataEmprestimo.
- Se tudo OK, cria Emprestimo, marca livro como não disponível e adiciona à lista de empréstimos.
- exibirLivros(): exibe todos os livros.
- exibirEmprestimos(): exibe todos os empréstimos.
- (Opcional) devolverLivro(Emprestimo e): marca devolvido e torna livro disponível.
- Código exemplo (resumido):
import java.time.LocalDate;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class Biblioteca {
private List<Livro> livros;
private List<Usuario> usuarios; // necessário para cadastrar/checar usuários
private List<Emprestimo> emprestimos;
public Biblioteca() {
this.livros = new ArrayList<>();
this.usuarios = new ArrayList<>();
this.emprestimos = new ArrayList<>();
}
public boolean cadastrarUsuario(Usuario u) {
for (Usuario exist : usuarios) {
if (exist.getMatricula().equals(u.getMatricula())) {
return false; // já cadastrado
}
}
usuarios.add(u);
return true;
}
public boolean cadastrarLivro(Livro l) {
for (Livro exist : livros) {
if (exist.getTitulo().equalsIgnoreCase(l.getTitulo())
&& exist.getEditora().equalsIgnoreCase(l.getEditora())
&& exist.getAno() == l.getAno()
&& exist.getEdicao() == l.getEdicao()) {
return false; // exemplar considerado duplicado
}
}
livros.add(l);
return true;
}
public boolean cadastrarEmprestimo(String matricula, String titulo,
LocalDate dataEmprestimo, LocalTime horaEmprestimo,
LocalDate dataLimite) {
// procura usuário
Optional<Usuario> userOpt = usuarios.stream()
.filter(u -> u.getMatricula().equals(matricula)).findFirst();
if (!userOpt.isPresent()) return false;
// procura livro
Optional<Livro> livroOpt = livros.stream()
.filter(l -> l.getTitulo().equalsIgnoreCase(titulo)).findFirst();
if (!livroOpt.isPresent()) return false;
Usuario usuario = userOpt.get();
Livro livro = livroOpt.get();
if (!livro.isDisponivel()) return false;
if (dataLimite.isBefore(dataEmprestimo)) return false;
Emprestimo e = new Emprestimo(dataEmprestimo, horaEmprestimo, dataLimite, livro, usuario);
emprestimos.add(e);
livro.setDisponivel(false); // marca como emprestado
return true;
}
public List<Livro> getLivros() { return new ArrayList<>(livros); }
public List<Usuario> getUsuarios() { return new ArrayList<>(usuarios); }
public List<Emprestimo> getEmprestimos() { return new ArrayList<>(emprestimos); }
public void exibirLivros() {
System.out.println("=== Livros cadastrados ===");
for (Livro l : livros) System.out.println(l);
}
public void exibirEmprestimos() {
System.out.println("=== Empréstimos registrados ===");
for (Emprestimo e : emprestimos) System.out.println(e);
}
// Método opcional de devolução
public boolean devolverLivro(String matricula, String titulo) {
for (Emprestimo e : emprestimos) {
if (!e.isDevolvido()
&& e.getUsuario().getMatricula().equals(matricula)
&& e.getLivro().getTitulo().equalsIgnoreCase(titulo)) {
e.setDevolvido(true);
e.getLivro().setDisponivel(true);
return true;
}
}
return false;
}
}
- Observações didáticas:
- Uso de Optional e streams é uma forma limpa de buscar elementos, mas poderia ser feito com laços for simples.
- As assinaturas dos métodos podem ser ajustadas conforme necessidade da interface (por exemplo, aceitar objetos em vez de títulos/matrículas).
- Validações importantes: usuário deve estar cadastrado; livro deve existir e estar disponível; data limite não pode ser anterior à data do empréstimo.
Passo 7
Exemplo prático de uso (classe Main) e explicações passo a passo de execução.
- O objetivo aqui é mostrar, passo a passo, como usar a Biblioteca para cadastrar livros, usuários e registrar um empréstimo.
- Exemplo de código main:
import java.time.LocalDate;
import java.time.LocalTime;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
Biblioteca b = new Biblioteca();
// cadastrar usuários
Usuario u1 = new Usuario("Ana Silva", 21, "F", "1199999-0000", "A001");
b.cadastrarUsuario(u1);
// cadastrar livros
Livro l1 = new Livro("Cálculo I", Arrays.asList("James Stewart"), "Matemática",
"Editora A", 2015, 7, 900);
b.cadastrarLivro(l1);
// tentar emprestar
boolean sucesso = b.cadastrarEmprestimo("A001", "Cálculo I",
LocalDate.now(), LocalTime.now(), LocalDate.now().plusDays(7));
System.out.println("Empréstimo registrado? " + sucesso);
// exibir estado
b.exibirLivros();
b.exibirEmprestimos();
// devolver livro (opcional)
boolean devolveu = b.devolverLivro("A001", "Cálculo I");
System.out.println("Devolução ocorreu? " + devolveu);
// exibir novamente
b.exibirLivros();
b.exibirEmprestimos();
}
}
- Passos executados no main:
- Cria a instância da Biblioteca.
- Cria e cadastra um Usuário.
- Cria e cadastra um Livro.
- Registra um empréstimo entre o usuário e o livro — o método verifica disponibilidade e datas.
- Exibe livros e empréstimos.
- Demonstra devolução e exibe o estado atualizado.
Passo 8
Boas práticas, possíveis extensões e dicas para a prova (o que você deve lembrar durante uma prova).
- Boas práticas úteis para aplicar rápido em prova:
- Sempre encapsule (atributos private + getters/setters). Mostre essa prática no enunciado.
- Use listas (ArrayList) para coleções dinâmicas; em provas, mostrar a declaração e a adição com add() é suficiente.
- Ao cadastrar, verifique chaves únicas (por exemplo, matrícula) para evitar duplicados.
- Para data/hora, mencione LocalDate/LocalTime (ou Date se a prova ainda usar versões antigas). Explique por que LocalDate é preferível (API mais segura).
- Pensar em disponibilidade (boolean) ou quantidade de cópias: se a prova fala de várias cópias de um mesmo título, modelar um campo quantidade é necessário; se não, um boolean basta para um exemplar.
- Extensões possíveis que podem aparecer em questões mais difíceis:
- Controle de múltiplas cópias: adicionar campo int quantidade e decrementar/incrementar quando emprestar/devolver.
- Histórico de empréstimos com datas de devolução e cálculo de multas (calcular diferença entre dataLimite e dataDevolucao).
- Persistência (salvar em arquivo ou banco de dados).
- Dicas rápidas para não se enrolar na prova:
- Primeiro desenhe as classes e relações (quem tem referência em quem).
- Liste os atributos exigidos e só depois decida se acrescenta algum atributo extra (e explique sucintamente por que).
- Escreva um método simples para cada operação pedida; valide apenas o essencial para economizar tempo.
Resposta
// Código completo (exemplo funcional). Coloque cada classe em seu arquivo .java correspondente.
import java.time.LocalDate;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
/* Classe Livro */
public class Livro {
private String titulo;
private List<String> autores;
private String area;
private String editora;
private int ano;
private int edicao;
private int numeroFolhas;
private boolean disponivel; // atributo extra para controle de disponibilidade
public Livro(String titulo, List<String> autores, String area, String editora,
int ano, int edicao, int numeroFolhas) {
this.titulo = titulo;
this.autores = new ArrayList<>(autores);
this.area = area;
this.editora = editora;
this.ano = ano;
this.edicao = edicao;
this.numeroFolhas = numeroFolhas;
this.disponivel = true;
}
public String getTitulo() { return titulo; }
public void setTitulo(String titulo) { this.titulo = titulo; }
public List<String> getAutores() { return new ArrayList<>(autores); }
public void setAutores(List<String> autores) { this.autores = new ArrayList<>(autores); }
public String getArea() { return area; }
public void setArea(String area) { this.area = area; }
public String getEditora() { return editora; }
public void setEditora(String editora) { this.editora = editora; }
public int getAno() { return ano; }
public void setAno(int ano) { this.ano = ano; }
public int getEdicao() { return edicao; }
public void setEdicao(int edicao) { this.edicao = edicao; }
public int getNumeroFolhas() { return numeroFolhas; }
public void setNumeroFolhas(int numeroFolhas) { this.numeroFolhas = numeroFolhas; }
public boolean isDisponivel() { return disponivel; }
public void setDisponivel(boolean disponivel) { this.disponivel = disponivel; }
@Override
public String toString() {
return "Livro{titulo='" + titulo + "', autores=" + autores + ", area='" + area +
"', editora='" + editora + "', ano=" + ano + ", edicao=" + edicao +
", numeroFolhas=" + numeroFolhas + ", disponivel=" + disponivel + "}";
}
}
/* Classe Usuario */
public class Usuario {
private String nome;
private int idade;
private String sexo;
private String telefone;
private String matricula;
public Usuario(String nome, int idade, String sexo, String telefone, String matricula) {
this.nome = nome;
this.idade = idade;
this.sexo = sexo;
this.telefone = telefone;
this.matricula = matricula;
}
public String getNome() { return nome; }
public void setNome(String nome) { this.nome = nome; }
public int getIdade() { return idade; }
public void setIdade(int idade) { this.idade = idade; }
public String getSexo() { return sexo; }
public void setSexo(String sexo) { this.sexo = sexo; }
public String getTelefone() { return telefone; }
public void setTelefone(String telefone) { this.telefone = telefone; }
public String getMatricula() { return matricula; }
public void setMatricula(String matricula) { this.matricula = matricula; }
@Override
public String toString() {
return "Usuario{nome='" + nome + "', idade=" + idade + ", sexo='" + sexo +
"', telefone='" + telefone + "', matricula='" + matricula + "'}";
}
}
/* Classe Emprestimo */
public class Emprestimo {
private LocalDate dataEmprestimo;
private LocalTime horaEmprestimo;
private LocalDate dataLimite;
private Livro livro;
private Usuario usuario;
private boolean devolvido;
public Emprestimo(LocalDate dataEmprestimo, LocalTime horaEmprestimo,
LocalDate dataLimite, Livro livro, Usuario usuario) {
this.dataEmprestimo = dataEmprestimo;
this.horaEmprestimo = horaEmprestimo;
this.dataLimite = dataLimite;
this.livro = livro;
this.usuario = usuario;
this.devolvido = false;
}
public LocalDate getDataEmprestimo() { return dataEmprestimo; }
public void setDataEmprestimo(LocalDate dataEmprestimo) { this.dataEmprestimo = dataEmprestimo; }
public LocalTime getHoraEmprestimo() { return horaEmprestimo; }
public void setHoraEmprestimo(LocalTime horaEmprestimo) { this.horaEmprestimo = horaEmprestimo; }
public LocalDate getDataLimite() { return dataLimite; }
public void setDataLimite(LocalDate dataLimite) { this.dataLimite = dataLimite; }
public Livro getLivro() { return livro; }
public void setLivro(Livro livro) { this.livro = livro; }
public Usuario getUsuario() { return usuario; }
public void setUsuario(Usuario usuario) { this.usuario = usuario; }
public boolean isDevolvido() { return devolvido; }
public void setDevolvido(boolean devolvido) { this.devolvido = devolvido; }
@Override
public String toString() {
return "Emprestimo{data=" + dataEmprestimo + ", hora=" + horaEmprestimo +
", dataLimite=" + dataLimite + ", livro=" + livro.getTitulo() +
", usuario=" + usuario.getNome() + ", devolvido=" + devolvido + "}";
}
}
/* Classe Biblioteca */
public class Biblioteca {
private List<Livro> livros;
private List<Usuario> usuarios;
private List<Emprestimo> emprestimos;
public Biblioteca() {
this.livros = new ArrayList<>();
this.usuarios = new ArrayList<>();
this.emprestimos = new ArrayList<>();
}
public boolean cadastrarUsuario(Usuario u) {
for (Usuario exist : usuarios) {
if (exist.getMatricula().equals(u.getMatricula())) {
return false;
}
}
usuarios.add(u);
return true;
}
public boolean cadastrarLivro(Livro l) {
for (Livro exist : livros) {
if (exist.getTitulo().equalsIgnoreCase(l.getTitulo())
&& exist.getEditora().equalsIgnoreCase(l.getEditora())
&& exist.getAno() == l.getAno()
&& exist.getEdicao() == l.getEdicao()) {
return false;
}
}
livros.add(l);
return true;
}
public boolean cadastrarEmprestimo(String matricula, String titulo,
LocalDate dataEmprestimo, LocalTime horaEmprestimo,
LocalDate dataLimite) {
Optional<Usuario> userOpt = usuarios.stream()
.filter(u -> u.getMatricula().equals(matricula)).findFirst();
if (!userOpt.isPresent()) return false;
Optional<Livro> livroOpt = livros.stream()
.filter(l -> l.getTitulo().equalsIgnoreCase(titulo)).findFirst();
if (!livroOpt.isPresent()) return false;
Usuario usuario = userOpt.get();
Livro livro = livroOpt.get();
if (!livro.isDisponivel()) return false;
if (dataLimite.isBefore(dataEmprestimo)) return false;
Emprestimo e = new Emprestimo(dataEmprestimo, horaEmprestimo, dataLimite, livro, usuario);
emprestimos.add(e);
livro.setDisponivel(false);
return true;
}
public boolean devolverLivro(String matricula, String titulo) {
for (Emprestimo e : emprestimos) {
if (!e.isDevolvido()
&& e.getUsuario().getMatricula().equals(matricula)
&& e.getLivro().getTitulo().equalsIgnoreCase(titulo)) {
e.setDevolvido(true);
e.getLivro().setDisponivel(true);
return true;
}
}
return false;
}
public List<Livro> getLivros() { return new ArrayList<>(livros); }
public List<Usuario> getUsuarios() { return new ArrayList<>(usuarios); }
public List<Emprestimo> getEmprestimos() { return new ArrayList<>(emprestimos); }
public void exibirLivros() {
System.out.println("=== Livros cadastrados ===");
for (Livro l : livros) System.out.println(l);
}
public void exibirEmprestimos() {
System.out.println("=== Empréstimos registrados ===");
for (Emprestimo e : emprestimos) System.out.println(e);
}
}
/* Classe Main (exemplo de uso) */
public class Main {
public static void main(String[] args) {
Biblioteca b = new Biblioteca();
Usuario u1 = new Usuario("Ana Silva", 21, "F", "1199999-0000", "A001");
b.cadastrarUsuario(u1);
Livro l1 = new Livro("Cálculo I", Arrays.asList("James Stewart"), "Matemática",
"Editora A", 2015, 7, 900);
b.cadastrarLivro(l1);
boolean sucesso = b.cadastrarEmprestimo("A001", "Cálculo I",
LocalDate.now(), LocalTime.now(), LocalDate.now().plusDays(7));
System.out.println("Empréstimo registrado? " + sucesso);
b.exibirLivros();
b.exibirEmprestimos();
boolean devolveu = b.devolverLivro("A001", "Cálculo I");
System.out.println("Devolução ocorreu? " + devolveu);
b.exibirLivros();
b.exibirEmprestimos();
}
}