🚀 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) eset(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.
- 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;
}
}- Crie o arquivo
ArquivoShield.javapara 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
- Abra o arquivo onde está o método
main. - 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 Construtor | Saída Esperada do getSaldo() |
|---|---|
| 1000000.00 | Saldo 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ção | Valor Passado | Comportamento Esperado |
|---|---|---|
setNivelPoder | 100 | O valor é alterado para 100 |
setNivelPoder | -5 | O 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:
- 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 08. - 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 é 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.");
}
}