Lista 04#
Instruções#
- Observe com atenção os requisitos e como os pacotes para cada questão devem ser organizados.
- Todos os exercícios devem ser feitos em um único projeto do IntelliJ.
- A correção será feita presencialmente, com o professor executando os casos de teste na sua máquina.
- Baixe os casos de teste aqui
- Respeite a estrutura de pacotes também no diretório de testes, mas mova para o diretório de testes do seu projeto apenas os casos de testes em que estiver trabalhando. Caso contrário, seu projeto apresentará erro de compilação enquanto não implementar todas as classes e métodos usados nos casos de testes.
Exercícios#
Questão 01. Implemente a classe Receita que representa uma receita culinária cadastrada em um aplicativo.
Atributos:
| Atributo | Tipo | Descrição |
|---|---|---|
nome | String | Nome da receita |
tempoPreparo | int | Tempo de preparo em minutos |
rendimentoPorcoes | int | Quantidade de porções geradas |
ingredientes | List<String> | Lista interna de ingredientes |
Requisitos:
- As classes devem estar dentro do pacote
lista04.receita. - O construtor deve lançar
IllegalArgumentExceptionsenomefor nulo ou vazio, ou setempoPreparoourendimentoPorcoesforem menores ou iguais a zero. - Os setters de
tempoPreparoerendimentoPorcoesdevem lançarIllegalArgumentExceptionpara valores inválidos, com mensagem descritiva. - O método
getIngredientes()deve retornar uma cópia da lista interna, nunca a referência direta. - O método
adicionarIngrediente(String ingrediente)deve ignorar silenciosamente entradas nulas ou vazias (sem lançar exceção — são situações esperadas em tempo de execução). - O método
removerIngrediente(String ingrediente)deve remover o ingrediente se ele existir na lista, ignorando silenciosamente caso não exista.
Questão 02. Implemente a classe Drone que representa o estado operacional de um drone de monitoramento.
Atributos:
| Atributo | Tipo | Descrição |
|---|---|---|
identificador | String | Código único do drone (imutável após criação) |
bateria | int | Nível de bateria em % (0 a 100) |
altitude | int | Altitude atual em metros (0 a 120) |
emVoo | boolean | Indica se o drone está em voo |
Requisitos:
As classes devem estar dentro do pacote lista04.drone.
- O construtor deve lançar
IllegalArgumentExceptionseidentificadorfor nulo ou vazio. identificadornão possui setter — é definido apenas no construtor.setBateria(int valor)deve lançarIllegalArgumentExceptionse o valor estiver fora do intervalo 0–100, com mensagem indicando o valor recebido e o intervalo esperado.setAltitude(int metros)deve lançarIllegalArgumentExceptionse o valor for negativo ou acima de 120. Deve ignorar a operação (sem lançar exceção) caso o drone não esteja em voo.- O método
decolar()não deve alterar o estadoemVoocaso a bateria seja menor ou igual a 20%. Não lança exceção, pois bateria baixa é uma condição operacional normal. - O método
pousar()defineemVoo = falseealtitude = 0.
Questão 03. Implemente a classe Episodio que representa um episódio de um podcast.
Atributos:
| Atributo | Tipo | Descrição |
|---|---|---|
titulo | String | Título do episódio |
numero | int | Número do episódio (imutável após criação) |
duracaoMinutos | int | Duração em minutos |
status | String | Status: "RASCUNHO", "PUBLICADO" ou "ARQUIVADO" |
Requisitos:
As classes devem estar dentro do pacote lista04.podcast.
- O construtor deve lançar
IllegalArgumentExceptionnos seguintes casos, com mensagens descritivas:titulonulo ou vazio.numeromenor ou igual a zero.duracaoMinutosmenor ou igual a zero.
- O setter de
duracaoMinutosdeve lançarIllegalArgumentExceptionpara valores inválidos. numeronão possui setter.statusnão possui setter direto. As transições são feitas por três métodos, que ignoram a operação (sem lançar exceção) quando a transição não é permitida:publicar(): muda de"RASCUNHO"para"PUBLICADO". Inválido em qualquer outro estado.arquivar(): muda de"PUBLICADO"para"ARQUIVADO". Inválido em qualquer outro estado.restaurar(): muda de"ARQUIVADO"para"RASCUNHO". Inválido em qualquer outro estado.
Questão 04. Implemente as classes Musica e Playlist.
Classe Musica:
| Atributo | Tipo | Descrição |
|---|---|---|
titulo | String | Título da música |
artista | String | Nome do artista |
duracaoSegundos | int | Duração em segundos |
prioridade | String | "NORMAL" ou "URGENTE" |
Requisitos gerais:
As classes devem estar dentro do pacote lista04.musica.
Requisitos de Musica:
- O construtor deve lançar
IllegalArgumentExceptionsetituloouartistaforem nulos ou vazios, ou seduracaoSegundosfor menor ou igual a zero. - O setter de
prioridadedeve lançarIllegalArgumentExceptionse o valor não for"NORMAL"ou"URGENTE".
Classe Playlist:
| Atributo | Tipo | Descrição |
|---|---|---|
nome | String | Nome da playlist |
fila | List<Musica> | Lista interna de músicas (não exposta diretamente) |
Requisitos de Playlist:
- O construtor deve lançar
IllegalArgumentExceptionsenomefor nulo ou vazio. - Não forneça getter para
fila. - O método
adicionar(Musica m)deve lançarIllegalArgumentExceptionsemfor nulo. Músicas"URGENTE"são inseridas antes das"NORMAL"; músicas"NORMAL"vão para o final. - Implemente também os métodos:
remover(String titulo): remove a primeira música com o título informado, ignorando silenciosamente caso não exista.proximaMusica(): retorna (sem remover) a primeira música da fila, ounullse vazia.reproduzirProxima(): remove e retorna a primeira música da fila, ounullse vazia.tamanho(): retorna o número de músicas na fila.listar(): exibe título, artista e prioridade de cada música na ordem atual.
Questão 05. Implemente as classes ItemLaboratorio e EstoqueLaboratorio.
Classe ItemLaboratorio:
| Atributo | Tipo | Descrição |
|---|---|---|
codigo | String | Código do item (imutável) |
nome | String | Nome do item |
quantidadeDisponivel | int | Quantidade atual em estoque (≥ 0) |
quantidadeMinima | int | Quantidade mínima de segurança (> 0) |
status | String | "NORMAL", "ALERTA" ou "ESGOTADO" — calculado automaticamente |
Regras de status:
"ESGOTADO": quantidade disponível igual a zero."ALERTA": quantidade disponível maior que zero e menor ou igual à quantidade mínima."NORMAL": quantidade disponível maior que a quantidade mínima.
Requisitos gerais:
As classes devem estar dentro do pacote lista04.laboratorio.
Requisitos de ItemLaboratorio:
- O construtor deve lançar
IllegalArgumentExceptionsecodigoounomeforem nulos ou vazios, sequantidadeDisponivelfor negativa, ou sequantidadeMinimafor menor ou igual a zero. codigonão possui setter.statusnão possui setter — é recalculado automaticamente sempre quequantidadeDisponivelfor alterada.quantidadeDisponivelsó é alterada pelos métodos:entrada(int quantidade): deve lançarIllegalArgumentExceptionsequantidadefor menor ou igual a zero.saida(int quantidade): deve lançarIllegalArgumentExceptionsequantidadefor menor ou igual a zero. Deve ignorar a operação (sem lançar exceção) se o resultado deixar o estoque negativo, uma vez que falta de estoque é uma situação operacional esperada.
Classe EstoqueLaboratorio:
| Atributo | Tipo | Descrição |
|---|---|---|
itens | List<ItemLaboratorio> | Lista interna de itens |
Implemente os métodos:
cadastrar(ItemLaboratorio item): deve lançarIllegalArgumentExceptionseitemfor nulo.buscarPorCodigo(String codigo): retorna o item correspondente ounull.listarEmAlerta(): retorna uma cópia da lista contendo apenas itens com status"ALERTA"ou"ESGOTADO".
Questão 06. Implemente as classes Consulta e AgendaMedica.
Classe Consulta:
| Atributo | Tipo | Descrição |
|---|---|---|
id | int | Identificador único (imutável) |
nomePaciente | String | Nome do paciente |
nomeMedico | String | Nome do médico |
dataHora | String | Data e hora no formato "DD/MM/AAAA HH:MM" |
status | String | "AGENDADA", "CONFIRMADA", "CANCELADA" ou "REALIZADA" |
observacoes | String | Observações adicionais (pode ser vazio) |
Regras de transição de status:
| De → Para | Permitido? |
|---|---|
AGENDADA → CONFIRMADA | Sim |
AGENDADA → CANCELADA | Sim |
CONFIRMADA → REALIZADA | Sim |
CONFIRMADA → CANCELADA | Sim |
CANCELADA → qualquer | Não |
REALIZADA → qualquer | Não |
Requisitos gerais:
As classes devem estar dentro do pacote lista04.agendaMedica.
Requisitos de Consulta:
- O construtor deve lançar
IllegalArgumentExceptionsenomePaciente,nomeMedicooudataHoraforem nulos ou vazios, ou seidfor menor ou igual a zero. idnão possui setter.statusnão possui setter direto. As transições são feitas pelos métodosconfirmar(),cancelar()erealizar(), que ignoram a operação (sem lançar exceção) quando a transição não é permitida.observacoespossui getter e setter sem restrições.- Os demais atributos possuem apenas getter.
Classe AgendaMedica:
| Atributo | Tipo | Descrição |
|---|---|---|
consultas | List<Consulta> | Lista interna de consultas |
Implemente os métodos:
agendar(Consulta c): deve lançarIllegalArgumentExceptionsecfor nulo.buscarPorId(int id): retorna a consulta ounull.listarPorMedico(String nomeMedico): retorna uma cópia da lista filtrada pelo médico.listarAtivas(): retorna consultas com status"AGENDADA"ou"CONFIRMADA".
Questão 07. Implemente as classes Documento e FilaDeImpressao.
Classe Documento:
| Atributo | Tipo | Descrição |
|---|---|---|
nome | String | Nome do arquivo |
numeroPaginas | int | Número de páginas (> 0) |
prioridade | String | "NORMAL" ou "URGENTE" |
status | String | "AGUARDANDO", "IMPRIMINDO" ou "CONCLUIDO" |
Requisitos gerais:
As classes devem estar dentro do pacote lista04.impressao.
Requisitos de Documento:
- O construtor deve lançar
IllegalArgumentExceptionsenomefor nulo ou vazio, senumeroPaginasfor menor ou igual a zero, ou seprioridadenão for"NORMAL"ou"URGENTE". - O status inicia como
"AGUARDANDO"e não possui setter direto. As transições seguem a ordemAGUARDANDO → IMPRIMINDO → CONCLUIDOe são feitas pelos métodosiniciarImpressao()econcluir(), que ignoram a operação (sem lançar exceção) quando chamados fora de ordem.
Classe FilaDeImpressao:
| Atributo | Tipo | Descrição |
|---|---|---|
nome | String | Nome da impressora |
fila | List<Documento> | Lista interna — não exposta diretamente |
Requisitos de FilaDeImpressao:
- O construtor deve lançar
IllegalArgumentExceptionsenomefor nulo ou vazio. - Não forneça getter para
fila. - Implemente os métodos:
adicionar(Documento d): deve lançarIllegalArgumentExceptionsedfor nulo. Documentos"URGENTE"são inseridos ao final do bloco de urgentes já existente (antes dos normais); documentos"NORMAL"vão para o final da fila.cancelar(String nome): remove da fila o documento com aquele nome somente se seu status for"AGUARDANDO". Ignora (sem lançar exceção) se o documento não for encontrado ou não puder ser cancelado.imprimirProximo(): pega o primeiro documento da fila, chamainiciarImpressao()e depoisconcluir(), exibindo nome e número de páginas. Remove-o da fila ao concluir. Exibe mensagem se a fila estiver vazia.exibirFila(): mostra nome, prioridade e status de cada documento na ordem atual.totalPaginasNaFila(): retorna a soma das páginas de todos os documentos ainda na fila.