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á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