🚀 Capítulo 09: Enumerações e Composição
🎯 Objetivo da Aula
Ao final desta aula, você será capaz de utilizar Enumerações (Enums) para definir conjuntos fixos de constantes e aplicar o conceito de Composição para criar relações do tipo “tem-um” entre objetos em Java.
🏢 O Cenário Prático (Seu Desafio)
Você foi convocado pelos meistres da Cidadela para desenvolver o sistema de registro dos dragões de Westeros (inspirado em Casa do Dragão). O seu desafio é criar uma estrutura onde cada dragão tenha um tamanho fixo (definido por categorias) e esteja associado obrigatoriamente a um cavaleiro específico.
🧠 Fundamentos: A Teoria Traduzida
À medida que nossos sistemas crescem, as classes precisam se relacionar para representar o mundo real.
- Enumeração (Enum): É um tipo especial de classe que representa um grupo de constantes (valores fixos que não mudam). Use quando você tem opções pré-definidas. (Ex: Os tamanhos dos dragões: PEQUENO, MÉDIO, GRANDE).
- Composição: É o princípio de criar objetos complexos combinando outros objetos. É a famosa relação “tem-um”. (Ex: Um Dragão tem um Cavaleiro).
Relação de Composição
classDiagram class Dragao { +String nome +Tamanho tamanho +Cavaleiro cavaleiro } class Cavaleiro { +String nome +String casa } Dragao *-- Cavaleiro : Tem um
📖 Exemplo Guiado
Vamos criar o sistema de registro de dragões. Siga o passo a passo:
- Crie o arquivo
Tamanho.java(o nosso Enum):
public enum Tamanho {
PEQUENO,
MEDIO,
GRANDE
}- Crie o arquivo
Cavaleiro.java(a classe que fará parte do dragão):
public class Cavaleiro {
private String nome;
private String casa;
public Cavaleiro(String nome, String casa) {
this.nome = nome;
this.casa = casa;
}
public String getNome() { return nome; }
public String getCasa() { return casa; }
}- Crie o arquivo
Dragao.java(a classe que compõe o objeto Cavaleiro):
public class Dragao {
private String nome;
private Tamanho tamanho;
private Cavaleiro cavaleiro; // Composição aqui!
public Dragao(String nome, Tamanho tamanho, Cavaleiro cavaleiro) {
this.nome = nome;
this.tamanho = tamanho;
this.cavaleiro = cavaleiro;
}
public void exibirFicha() {
System.out.println("Dragão: " + nome);
System.out.println("Tamanho: " + tamanho);
System.out.println("Montado por: " + cavaleiro.getNome() + " da casa " + cavaleiro.getCasa());
}
}- Crie o arquivo
Cidadela.javapara rodar o teste:
public class Cidadela {
public static void main(String[] args) {
Cavaleiro c1 = new Cavaleiro("Daemon", "Targaryen");
Dragao d1 = new Dragao("Caraxes", Tamanho.GRANDE, c1);
d1.exibirFicha();
}
}🕹️ Como Executar e Testar no VS Code
- Abra o arquivo
Cidadela.java. - Clique em Run logo acima do método
main.
Resultado Esperado:
Dragão: Caraxes
Tamanho: GRANDE
Montado por: Daemon da casa Targaryen🛠️ Prática Obrigatória 1
Crie um Enum chamado RankGuerreiro com as opções: RECRUTA, VETERANO, ELITE. Crie uma classe Guerreiro com os atributos nome e rank (usando o Enum). No método main, instancie um guerreiro e exiba seus dados.
Resultado Esperado:
| Atributos de Teste | Saída Esperada |
|---|---|
| ”Criston Cole”, ELITE | Guerreiro: Criston Cole |
| Rank: ELITE |
🛠️ Prática Obrigatória 2
Crie uma classe Montaria com o atributo nome (String). Atualize a classe Guerreiro da Prática 1 para que ela tenha um atributo do tipo Montaria (aplicando a Composição). Exiba os dados do guerreiro e o nome de sua montaria.
Resultado Esperado:
| Guerreiro | Montaria | Saída Esperada |
|---|---|---|
| ”Criston Cole" | "Corcel Negro” | Guerreiro: Criston Cole |
| Rank: ELITE | ||
| Montaria: Corcel Negro |
📤 Instruções de Entrega (GitHub Desktop + Microsoft Teams)
Neste curso, você entregará suas atividades enviando o código para o seu repositório no GitHub usando o aplicativo GitHub Desktop. Siga o passo a passo detalhado:
- Verifique a estrutura: Certifique-se de que sua estrutura de pastas final está idêntica à mostrada abaixo.
- Abra o GitHub Desktop: Certifique-se de que o repositório do seu curso está selecionado no canto superior esquerdo.
- Visualize as alterações: Na aba Changes (à esquerda), você verá todos os arquivos que criou ou modificou nesta aula.
- Faça o Commit:
- No campo Summary (na parte inferior esquerda), digite uma mensagem curta descrevendo o que fez, ex:
Finaliza atividades do Capítulo 09. - Clique no botão azul Commit to main (ou o nome da sua branch).
- No campo Summary (na parte inferior esquerda), digite uma mensagem curta descrevendo o que fez, ex:
- Envie para a Nuvem (Push): No topo da tela, clique no botão Push origin. Isso enviará seu código do seu computador para o seu perfil no GitHub.
- ⚠️ IMPORTANTE (Repositório Público): Para que o professor consiga corrigir, o seu repositório no GitHub DEVE SER PÚBLICO. Repositórios privados não podem ser visualizados por quem não foi convidado.
- Como entregar no Microsoft Teams:
- Copie o link do seu repositório no GitHub (ex:
https://github.com/seu-usuario/seu-repositorio). - Abra a tarefa correspondente no Microsoft Teams.
- Clique no botão Adicionar trabalho (ou Add work).
- Selecione a opção Link no menu lateral.
- Cole o link do GitHub no campo “Endereço Web” e digite um texto (ex:
Meu Repositório) no campo “Texto a ser exibido”. - Clique em Anexar.
- MUITO IMPORTANTE: Clique no botão Entregar (ou Turn in) no canto superior direito para concluir o envio!
- Copie o link do seu repositório no GitHub (ex:
💡 Checkpoint de Lógica
O que você acabou de fazer é modelar relações complexas. Em sistemas reais de e-commerce, um objeto Pedido (como o Dragão) contém um objeto Cliente (como o Cavaleiro) e uma lista de produtos. A composição permite criar sistemas modulares e organizados!
🔥 Desafio de Fixação (Opcional)
Faça com que a classe Dragao tenha um método para trocar de cavaleiro (um método setCavaleiro), permitindo que outro cavaleiro monte o dragão.
🔑 Gabarito de Código/Fórmulas
Prática 1:
public enum RankGuerreiro {
RECRUTA, VETERANO, ELITE
}
class Guerreiro {
private String nome;
private RankGuerreiro rank;
public Guerreiro(String nome, RankGuerreiro rank) {
this.nome = nome;
this.rank = rank;
}
public void exibir() {
System.out.println("Guerreiro: " + nome);
System.out.println("Rank: " + rank);
}
}Prática 2:
public class Montaria {
private String nome;
public Montaria(String nome) { this.nome = nome; }
public String getNome() { return nome; }
}
class Guerreiro {
private String nome;
private RankGuerreiro rank;
private Montaria montaria; // Composição
public Guerreiro(String nome, RankGuerreiro rank, Montaria montaria) {
this.nome = nome;
this.rank = rank;
this.montaria = montaria;
}
public void exibir() {
System.out.println("Guerreiro: " + nome);
System.out.println("Rank: " + rank);
System.out.println("Montaria: " + montaria.getNome());
}
}Desafio:
// Adicionar na classe Dragao:
public void setCavaleiro(Cavaleiro novoCavaleiro) {
this.cavaleiro = novoCavaleiro;
}