🚀 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:

  1. Crie o arquivo Tamanho.java (o nosso Enum):
public enum Tamanho {
    PEQUENO,
    MEDIO,
    GRANDE
}
  1. 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; }
}
  1. 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());
    }
}
  1. Crie o arquivo Cidadela.java para 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

  1. Abra o arquivo Cidadela.java.
  2. 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 TesteSaída Esperada
”Criston Cole”, ELITEGuerreiro: 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:

GuerreiroMontariaSaí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:

  1. Verifique a estrutura: Certifique-se de que sua estrutura de pastas final está idêntica à mostrada abaixo.
  2. Abra o GitHub Desktop: Certifique-se de que o repositório do seu curso está selecionado no canto superior esquerdo.
  3. Visualize as alterações: Na aba Changes (à esquerda), você verá todos os arquivos que criou ou modificou nesta aula.
  4. 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).
  5. 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.
  6. ⚠️ 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.
  7. 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!

💡 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;
}

Capitulo Anterior | Proximo Capitulo