🚀 Capítulo 08: Construtores e Encapsulamento

🎯 Objetivo da Aula

Ao final desta aula, você será capaz de utilizar Construtores para inicializar objetos com dados obrigatórios e aplicar o Encapsulamento (usando modificadores de acesso private e métodos get e set) para proteger os dados de uma classe.


🏢 O Cenário Prático (Seu Desafio)

Você está desenvolvendo o sistema de arquivos secretos da S.H.I.E.L.D. (ou do Batcomputador). O seu desafio é cadastrar os heróis no sistema garantindo que a sua Identidade Secreta não possa ser visualizada ou alterada diretamente por qualquer pessoa. Ela deve ser protegida (encapsulada).


🧠 Fundamentos: A Teoria Traduzida

Na POO, precisamos proteger os dados dos nossos objetos para garantir a segurança e evitar que valores inválidos sejam inseridos.

  • Construtor: É um método especial chamado no momento em que criamos o objeto (com o comando new). Ele serve para garantir que o objeto já “nasça” com os dados necessários. (Ex: Ao cadastrar um herói, o codinome dele já deve ser definido obrigatoriamente).
  • Encapsulamento: É a prática de esconder os detalhes internos de um objeto. Em Java, fazemos isso tornando os atributos private.
  • Getters e Setters: Como os atributos privados não podem ser acessados de fora da classe, criamos métodos públicos get (para ler) e set (para alterar) o valor. Eles funcionam como a chave para abrir o cofre.

Analogia do Cofre

flowchart TD
    A["Usuário"] -->|Tenta acessar diretamente| B["Atributo Privado (Cofre)"]
    B -->|Acesso Negado| C["Erro de Compilação"]
    A -->|Usa o método Get / Set| D["Método Público (Chave do Cofre)"]
    D -->|Acesso Permitido| B

📖 Exemplo Guiado

Vamos criar a classe Heroi com a identidade secreta protegida.

  1. Crie o arquivo Heroi.java (a classe):
public class Heroi {
    // Atributos privados (protegidos)
    private String codinome;
    private String identidadeSecreta;
 
    // Construtor: Exige os dados ao criar o objeto
    public Heroi(String codinome, String identidadeSecreta) {
        this.codinome = codinome;
        this.identidadeSecreta = identidadeSecreta;
    }
 
    // Getter para ler o codinome (Público)
    public String getCodinome() {
        return codinome;
    }
 
    // Getter para ler a identidade (Público)
    public String getIdentidadeSecreta() {
        return identidadeSecreta;
    }
 
    // Setter para alterar a identidade (Público)
    public void setIdentidadeSecreta(String identidadeSecreta) {
        this.identidadeSecreta = identidadeSecreta;
    }
}
  1. Crie o arquivo ArquivoShield.java para testar o sistema:
public class ArquivoShield {
    public static void main(String[] args) {
        // Usando o construtor para criar o herói com dados iniciais
        Heroi h1 = new Heroi("Batman", "Bruce Wayne");
        
        System.out.println("Herói cadastrado no sistema!");
        System.out.println("Codinome: " + h1.getCodinome());
        
        // Se tentarmos fazer: h1.identidadeSecreta = "Outro"; dará ERRO!
        
        // Acessando a informação protegida via Getter
        System.out.println("Identidade Secreta: " + h1.getIdentidadeSecreta());
    }
}

🕹️ Como Executar e Testar no VS Code

  1. Abra o arquivo onde está o método main.
  2. Clique em Run logo acima do método main.

Resultado Esperado:

Herói cadastrado no sistema!
Codinome: Batman
Identidade Secreta: Bruce Wayne


🛠️ Prática Obrigatória 1

Crie uma classe chamada ContaBancaria (simulando a conta secreta do Batman). Ela deve ter o atributo private double saldo. Crie um construtor que receba o saldo inicial e um método getSaldo() para ler o saldo. Não crie o método setSaldo(), pois o saldo não deve ser alterado diretamente sem um depósito ou saque!

Resultado Esperado:

Entrada no ConstrutorSaída Esperada do getSaldo()
1000000.00Saldo Atual: R$ 1000000.00

🛠️ Prática Obrigatória 2

Crie uma classe HeroiPoderoso semelhante ao exemplo, mas adicione um atributo private int nivelPoder. Crie o construtor, os getters e setters. No método setNivelPoder, adicione uma regra de negócio: o nível de poder só pode ser alterado se o novo valor for maior que zero!

Resultado Esperado:

OperaçãoValor PassadoComportamento Esperado
setNivelPoder100O valor é alterado para 100
setNivelPoder-5O valor negativo deve ser ignorado (não altera)

📤 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 08.
    • 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 é garantir a Integridade dos Dados. Em sistemas corporativos reais (como bancos ou redes sociais), você nunca deixa os dados sensíveis abertos. Você os encapsula e cria regras rígidas (nos setters) para permitir alterações seguras!


🔥 Desafio de Fixação (Opcional)

No método setIdentidadeSecreta da classe Heroi, faça com que a alteração só seja permitida se a nova identidade passada não for vazia ("") e não for nula.


🔑 Gabarito de Código/Fórmulas

Prática 1:

public class ContaBancaria {
    private double saldo;
 
    public ContaBancaria(double saldoInicial) {
        this.saldo = saldoInicial;
    }
 
    public double getSaldo() {
        return saldo;
    }
 
    public static void main(String[] args) {
        ContaBancaria conta = new ContaBancaria(1000000.00);
        System.out.println("Saldo Atual: R$ " + conta.getSaldo());
    }
}

Prática 2:

public class HeroiPoderoso {
    private String nome;
    private int nivelPoder;
 
    public HeroiPoderoso(String nome, int nivelPoder) {
        this.nome = nome;
        this.nivelPoder = nivelPoder;
    }
 
    public int getNivelPoder() {
        return nivelPoder;
    }
 
    public void setNivelPoder(int nivelPoder) {
        if (nivelPoder > 0) {
            this.nivelPoder = nivelPoder;
        } else {
            System.out.println("Poder inválido! Deve ser maior que zero.");
        }
    }
}

Desafio:

public void setIdentidadeSecreta(String identidadeSecreta) {
    if (identidadeSecreta != null && !identidadeSecreta.trim().isEmpty()) {
        this.identidadeSecreta = identidadeSecreta;
    } else {
        System.out.println("Identidade inválida! Não pode ser vazia.");
    }
}

Capitulo Anterior | Proximo Capitulo