Interface do Administrador
Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy. Lição 81 de 87.
Desafio
FácilVamos expandir seu Sistema de Gerenciamento de Biblioteca com uma Interface de Administrador! Uma biblioteca real precisa de capacidades administrativas — adicionar novos livros à coleção, remover os desatualizados e registrar novos membros. Você criará uma interface que define essas operações administrativas e as implementará em uma classe de administração dedicada.
Você continuará construindo sobre seu código existente em cinco arquivos:
Book.java: Mantenha sua classe Book com toda a funcionalidade existente — isbn, title, author, isAvailable, borrowedBy, getDetails() e os getters/setters apropriados.User.java: Mantenha sua classe User inalterada com id, name, o ArrayList borrowedBooks, borrowBook(), returnBook(), getBorrowedCount() e toString().Library.java: Mantenha sua classe Library com todos os métodos existentes. Adicione um novo métodoremoveBook(String isbn)que encontra e remove um livro da coleção pelo seu ISBN. O método deve retornartruese o livro foi encontrado e removido, efalsecaso contrário. Um livro só pode ser removido se estiver disponível no momento (não emprestado).LibraryAdmin.java: Crie uma interface chamadaLibraryAdminque define o contrato para operações administrativas. Sua interface deve declarar três métodos:addBook(String isbn, String title, String author)- retorna um booleano indicando sucessoremoveBook(String isbn)- retorna um booleano indicando sucessoregisterUser(String id, String name)- retorna um booleano indicando sucesso
Em seguida, crie uma classe chamada
AdminServiceque implementa esta interface. O AdminService deve manter uma referência a uma Library (passada através de seu construtor) e implementar todos os três métodos delegando para a Library enquanto adiciona o feedback apropriado. Ao adicionar um livro, crie um novo Book e adicione-o à biblioteca. Ao registrar um usuário, crie um novo User e registre-o.Main.java: Demonstre seu sistema de administração! Você receberá uma série de comandos de administração como uma única string separada por vírgulas. Cada comando segue um destes formatos:ADD_BOOK:isbn:title:authorREMOVE_BOOK:isbnREGISTER_USER:id:nameBORROW:userId:isbn
Crie uma Library e um AdminService. Processe cada comando e imprima o resultado:
- Para ADD_BOOK: imprima
Added: [title]em caso de sucesso - Para REMOVE_BOOK: imprima
Removed: [isbn]em caso de sucesso, ouCannot remove: [isbn]se o livro não existir ou estiver emprestado - Para REGISTER_USER: imprima
Registered: [name] - Para BORROW: use a funcionalidade de empréstimo da biblioteca existente
Após processar todos os comandos, imprima
Library status:seguido pelos detalhes de cada livro e status de disponibilidade no formato[details] - [Available/Borrowed].
Você receberá uma entrada: uma string de comandos separada por vírgulas.
Por exemplo, com a entrada REGISTER_USER:U001:Alice,ADD_BOOK:ISBN-001:Clean Code:Robert Martin,ADD_BOOK:ISBN-002:Design Patterns:Gang of Four,BORROW:U001:ISBN-001,REMOVE_BOOK:ISBN-001,REMOVE_BOOK:ISBN-002, sua saída seria:
Registered: Alice
Added: Clean Code
Added: Design Patterns
Alice borrowed Clean Code
Cannot remove: ISBN-001
Removed: ISBN-002
Library status:
[ISBN-001] Clean Code by Robert Martin - BorrowedObserve como a interface de administração fornece um contrato limpo para operações administrativas, enquanto a implementação AdminService lida com a lógica real. O sistema impede corretamente a remoção de um livro emprestado, permitindo a remoção dos disponíveis. Essa separação de interface e implementação é um princípio fundamental de POO que torna seu código mais fácil de manter e testar!
Experimente você mesmo
import java.util.Scanner;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Ler os comandos separados por vírgula
String input = scanner.nextLine();
String[] commands = input.split(",");
// Criar Library e AdminService
Library library = new Library();
AdminService adminService = new AdminService(library);
// Processar cada comando
for (String command : commands) {
String[] parts = command.split(":");
String operation = parts[0];
if (operation.equals("ADD_BOOK")) {
String isbn = parts[1];
String title = parts[2];
String author = parts[3];
if (adminService.addBook(isbn, title, author)) {
System.out.println("Added: " + title);
}
} else if (operation.equals("REMOVE_BOOK")) {
String isbn = parts[1];
if (adminService.removeBook(isbn)) {
System.out.println("Removed: " + isbn);
} else {
System.out.println("Cannot remove: " + isbn);
}
} else if (operation.equals("REGISTER_USER")) {
String id = parts[1];
String name = parts[2];
if (adminService.registerUser(id, name)) {
System.out.println("Registered: " + name);
}
} else if (operation.equals("BORROW")) {
String userId = parts[1];
String isbn = parts[2];
library.borrowBook(userId, isbn);
}
}
// Imprimir o status da biblioteca
System.out.println("Library status:");
ArrayList<Book> allBooks = library.getAllBooks();
for (Book book : allBooks) {
String status = book.isAvailable() ? "Available" : "Borrowed";
System.out.println(book.getDetails() + " - " + status);
}
}
}
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