Projeto acadêmico (POO) que simula o comportamento de um ou mais elevadores em um prédio.
Criar uma aplicação em Java que modele elevadores, suas regras de operação (capacidade, movimentação, manutenção) e que permita executar uma simulação através de um main que exiba o estado dos elevadores após cada operação.
Arquivos principais:
app/main.java— Classe com o métodomainque executa a simulação.model/elevator.java— Modelo da entidade Elevador (atributos e getters/setters).model/build.java— (opcional) Arquivo auxiliar (atualmente vazio).service/elevatorService.java— Regras de negócio e operações sobre o elevador.
Observação: neste repositório alguns arquivos de modelo estão vazios (ou incompletos). Veja a seção "Próximos passos" abaixo para sugestões de implementação.
Elevador(model): mantém estado (andar atual, total de andares, capacidade, pessoas presentes, emManutencao) e expõe getters/setters.Predio(não existe um arquivo explícito atualmente): é responsável por agregar elevadores e oferecer métodos para adicionar/recuperar elevadores.ElevadorService(service): implementa lógica como subir/descer, embarcar/desembarcar pessoas e gerar uma string de status.Main(app/main.java): interação com o usuário / execução da simulação e exibição dos estados comSystem.out.println.
A seguir estão regras claras (contratos) para cada classe do sistema. Use estas regras como referência de implementação e para testes.
-
Atributos obrigatórios:
private int andarAtual— valor inicial: 0 (térreo).private int totalAndares— número máximo de andares (>= 0).private int capacidade— capacidade máxima de pessoas (>= 1).private int pessoasPresentes— número atual de pessoas (>= 0 e <= capacidade).private boolean emManutencao—truequando em manutenção (movimentação e embarque/desembarque proibidos).
-
Métodos obrigatórios (assinaturas mínimas):
public void inicializar(int capacidade, int totalAndares)- Pré-condições:
capacidade > 0,totalAndares >= 0. - Pós-condições:
this.capacidade == capacidade,this.totalAndares == totalAndares,andarAtual == 0,pessoasPresentes == 0,emManutencao == false.
- Pré-condições:
public void entrar()- Somente se
!emManutencaoepessoasPresentes < capacidade. - Se não puder entrar, manter estado inalterado.
- Somente se
public void sair()- Somente se
!emManutencaoepessoasPresentes > 0. - Se não houver pessoas, manter estado inalterado.
- Somente se
public void subir()- Somente se
!emManutencaoeandarAtual < totalAndares. - Incrementa
andarAtualem 1.
- Somente se
public void descer()- Somente se
!emManutencaoeandarAtual > 0. - Decrementa
andarAtualem 1.
- Somente se
public void colocarEmManutencao()- Coloca
emManutencao = true(opcional: zera movimentos; não alterapessoasPresentes).
- Coloca
public void liberarManutencao()- Coloca
emManutencao = false.
- Coloca
- Getters para todos os atributos:
getAndarAtual(),getTotalAndares(),getCapacidade(),getPessoasPresentes(),isEmManutencao().
-
Invariantes / comportamentos esperados:
0 <= andarAtual <= totalAndares.0 <= pessoasPresentes <= capacidade.- Enquanto
emManutencao == truenão é possível alterarandarAtualnempessoasPresentes.
-
Erros/retornos: as versões mínimas usam
voide não lançam exceções; implementações podem optar por lançarIllegalStateExceptionem pré-condições violadas ou retornarbooleanindicando sucesso/fracasso. -
Sugestão de API (mais informativa):
public boolean entrar()— retornatruese a operação teve sucesso,falsecaso contrário.public boolean sair()— idem.public boolean subir()/public boolean descer()— idem.
-
Atributos obrigatórios:
private String nome— nome do prédio.private List<Elevador> elevadores— lista de elevadores.
-
Métodos obrigatórios:
public Predio(String nome)— construtor que inicializanomee cria a lista vazia.public void adicionarElevador(Elevador elevador)— adiciona o elevador na lista.public Elevador getElevador(int indice)— retorna o elevador no índice (lançaIndexOutOfBoundsExceptionse índice inválido).public int getQuantidadeElevadores()— retornaelevadores.size().public String getNome()— getter do nome.
-
Regras / comportamentos:
- Não aceitar
nullemadicionarElevador(lançarNullPointerExceptionou ignorar). - Operações sobre elevadores devem ser realizadas através de
ElevadorService(recomendado).
- Não aceitar
-
Responsabilidade: conter a lógica de regras de negócio, deixando o modelo (
Elevador) apenas como porta de estado. -
Métodos obrigatórios (assinaturas mínimas):
public void moverElevador(Elevador elevador, int destino)- Move o elevador andar-a-andar até
destino(0 <= destino <= totalAndares). - Deve respeitar
emManutencao(setrue, não deve mover). - Implementação mínima: enquanto
andarAtual < destinochamarelevador.subir(), enquantoandarAtual > destinochamarelevador.descer().
- Move o elevador andar-a-andar até
public void embarcarPessoas(Elevador elevador, int quantidade)- Tenta embarcar
quantidadepessoas, respeitandocapacidadeeemManutencao. - Operação deve adicionar no máximo
capacidade - pessoasPresentes.
- Tenta embarcar
public void desembarcarPessoas(Elevador elevador, int quantidade)- Remove até
quantidadepessoas, sem permitirpessoasPresentes < 0.
- Remove até
public String gerarStatus(Elevador elevador)- Retorna uma String formatada com todas as informações relevantes (andar, pessoas, capacidade, modo de manutenção).
-
Contrato / pré-condições:
elevadornão pode sernull(lançarNullPointerException).destinodeve estar no intervalo[0, elevador.getTotalAndares()].quantidadedeve ser >= 0; valores negativos devem ser ignorados ou lançarIllegalArgumentException.
-
Comportamentos esperados:
- Operações que alteram estado delegam para métodos de
Elevadorpara preservar encapsulamento. gerarStatusnunca altera o estado do elevador.
- Operações que alteram estado delegam para métodos de
-
Responsabilidade: ser a única classe a interagir diretamente com o usuário (entrada/saída).
-
Deveres:
- Criar e inicializar objetos (
Predio,Elevador,ElevadorService). - Executar uma sequência de operações para simular cenários (entrar/sair, subir/descer, manutenção).
- Chamar
ElevadorService.gerarStatus(...)e imprimir o resultado comSystem.out.printlnapós cada operação.
- Criar e inicializar objetos (
-
Regras de apresentação:
- Toda saída textual do estado do sistema deve ocorrer em
Main. Mainpode usarScannerpara entrada interativa, ou executar um script/simulação pré-definida.
- Toda saída textual do estado do sistema deve ocorrer em
- Separação de responsabilidades (SRP): modelos (
Elevador,Predio) mantêm apenas estado e validação simples; regras de negócio ficam emElevadorService; I/O emMain. - Testabilidade:
ElevadorServicedeve ser testável isoladamente (sem I/O). Prefira métodos com retorno informativo (boolean ou exceção) para facilitar asserts em testes. - Robustez: validar parâmetros de entrada e documentar comportamento em casos inválidos.
-
Crie um diretório de saída (opcional) e compile os arquivos Java (compila apenas os arquivos existentes):
mkdir -Force out; javac -d out app\main.java service\elevatorService.java model\*.java
-
Execute a aplicação:
java -cp out main
Observações:
- Se as classes estiverem em pacotes, ajuste os caminhos de compilação e o comando
javapara usar o nome qualificado da classe contendomain. - Se algum arquivo
.javaestiver vazio, o compilador irá ignorá-lo; implemente as classes necessárias antes de executar para ver a simulação completa.
Após cada operação o main deve imprimir algo como:
- "Elevador 1 — Andar: 2 | Pessoas: 3 | Capacidade: 6 | Status: Operacional"
- "Elevador 2 — Andar: 0 | Pessoas: 0 | Capacidade: 4 | Status: Em manutenção"
- Implementar a classe
model/elevator.javacom os atributos e métodos descritos acima. - Criar uma classe
model/predio.javapara gerenciar múltiplos elevadores. - Implementar os métodos em
service/elevatorService.javapara realizar as operações e retornar o status formatado. - Preencher
app/main.javacom uma simulação que cria um prédio, adiciona elevadores e aplica operações (entrar/sair, subir/descer, manutenção), imprimindo o status após cada ação.
Consulte o arquivo LICENSE no repositório.