Ocultação de Informações
Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy — lição 12 de 87.
A ocultação de informações é o princípio de restringir o acesso direto aos dados internos de um objeto. Ao combinar campos private com getters e setters, você cria uma barreira protetora em torno do estado do seu objeto.
Considere o que acontece sem a ocultação de informações:
public class Temperature {
public double celsius; // Exposto diretamente
}
// Qualquer pessoa pode definir valores inválidos
Temperature t = new Temperature();
t.celsius = -500; // Abaixo do zero absoluto - impossível!Com a ocultação de informações, você controla como os dados são acessados e modificados:
public class Temperature {
private double celsius;
public void setCelsius(double celsius) {
if (celsius >= -273.15) {
this.celsius = celsius;
}
}
public double getCelsius() {
return celsius;
}
}Agora, temperaturas inválidas são rejeitadas automaticamente. A representação interna está oculta - você poderia alterar posteriormente como a temperatura é armazenada internamente (talvez para Kelvin) sem afetar o código que utiliza a classe.
Esta abordagem oferece três benefícios principais: a validação garante a integridade dos dados, a flexibilidade permite alterações internas sem quebrar o código externo, e o controle permite que você decida exatamente quais operações são permitidas em seus dados.
Desafio
FácilVamos construir uma classe de gerenciamento de Password que demonstra a ocultação de informações, protegendo dados sensíveis e aplicando regras de segurança por meio de acesso controlado.
Você criará dois arquivos para organizar seu código:
Password.java: Crie uma classe Password que oculte seus dados internos e controle como as senhas podem ser definidas e acessadas:- Um campo privado
password(String) que armazena a senha real - Um campo privado
minLength(int) que define o comprimento mínimo aceitável da senha - Um construtor que recebe o requisito de comprimento mínimo
- Um setter
setPassword(String password)que só aceita senhas que atendam ao requisito de comprimento mínimo. Se for válida, armazene-a e retornetrue; se for muito curta, não altere a senha e retornefalse - Um getter
getMaskedPassword()que retorna a senha com todos os caracteres substituídos por asteriscos (*) - nunca exponha a senha real! - Um método
checkPassword(String attempt)que retornatruese a tentativa corresponder à senha armazenada, caso contrário,false - Um getter
getLength()que retorna o comprimento da senha atual (ou 0 se nenhuma senha estiver definida)
- Um campo privado
Main.java: Crie um objeto Password com um comprimento mínimo de 6, depois leia duas entradas: uma senha para definir e uma tentativa para verificar. Imprima três linhas:Set: trueouSet: false(resultado da definição da senha)Masked: ******(a versão mascarada da senha)Match: trueouMatch: false(resultado da verificação da tentativa)
Você receberá duas entradas: a senha para definir e a tentativa de senha para verificar.
Observe como a senha real nunca é acessível diretamente de fora da classe - isso é a ocultação de informações em ação. A classe controla exatamente quais informações são reveladas e como a senha pode ser modificada.
Folha de consulta
O ocultamento de informações restringe o acesso direto aos dados internos de um objeto usando campos private combinados com getters e setters.
Sem o ocultamento de informações, os campos ficam expostos e podem ser definidos com valores inválidos:
public class Temperature {
public double celsius; // Exposed directly
}
Temperature t = new Temperature();
t.celsius = -500; // Invalid value allowedCom o ocultamento de informações, você controla o acesso e valida os dados:
public class Temperature {
private double celsius;
public void setCelsius(double celsius) {
if (celsius >= -273.15) {
this.celsius = celsius;
}
}
public double getCelsius() {
return celsius;
}
}Principais benefícios do ocultamento de informações:
- Validação: Garante a integridade dos dados ao rejeitar valores inválidos
- Flexibilidade: Permite alterações internas sem afetar o código externo
- Controle: Permite que você decida quais operações são permitidas em seus dados
Experimente você mesmo
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Lê a senha a ser definida
String passwordToSet = scanner.nextLine();
// Lê a tentativa de senha para verificar
String passwordAttempt = scanner.nextLine();
// TODO: Create a Password object com comprimento mínimo de 6
// TODO: Defina a senha e imprima o resultado ("Set: true" ou "Set: false")
// TODO: Imprima a senha mascarada ("Masked: ******")
// TODO: Verifique a tentativa de senha e imprima o resultado ("Match: true" ou "Match: false")
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosA Palavra-chave thisMétodosCampos (Atributos)Método ConstrutorSobrecarga de ConstrutorRecapitulação - Calculadora Simples4Herança
Herança Básica (extends)A Palavra-chave superSobrescrita de Método (@Override)Encadeamento de ConstrutoresA Classe ObjectHerança Simples e MultinívelPor que não há Herança Múltipla de ClassesRecapitulação - Hierarquia de Funcionários7Métodos Especiais e a Classe Object
Método toString()equals() e hashCode()Método clone()compareTo() e ComparableInterface ComparatorRecapitulação - Ordenação Personalizada2Modificadores de Acesso e Encapsulamento
Visão Geral dos Níveis de AcessoMétodos Getter e SetterOcultação de InformaçõesA Palavra-chave finalRecapitulação - Gerenciador de Conta Bancária5Polimorfismo
Fundamentos de Sobrecarga de MétodosSobrescrita de Métodos (Tempo de Execução)Upcasting e DowncastingO Operador instanceofClasses e Métodos AbstratosRecapitulação - Calculadora de Formas8Conceitos Avançados de OOP
Composição vs HerançaAgregação vs ComposiçãoClasses Internas, Aninhadas e AnônimasEnums e Métodos de EnumRecords (Java 16+)Classes Seladas (Java 17+)11Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão BuilderPadrão ObserverPadrão Strategy3Propriedades de Classe e Membros Estáticos
Variáveis de Instância vs EstáticasMétodos EstáticosBlocos EstáticosConstantes (static final)Recapitulação - Contador e Utilitário6Interfaces e Classes Abstratas
Introdução às InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesDefault e Static em InterfacesClasses Abstratas vs InterfacesInterfaces FuncionaisRecapitulação - Sistema de Pagamento9Generics
Introdução a GenericsClasses GenéricasMétodos GenéricosParâmetros de Tipos DelimitadosWildcards (?, extends, super)Recapitulação - Container Genérico12Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Iterator