Ocultamiento de información
Parte de la sección Programación Orientada a Objetos del Journey de Java de Coddy — lección 12 de 87.
El ocultamiento de información es el principio de restringir el acceso directo a los datos internos de un objeto. Al combinar campos private con getters y setters, creas una barrera protectora alrededor del estado de tu objeto.
Considera lo que sucede sin la ocultación de información:
public class Temperature {
public double celsius; // Expuesto directamente
}
// Cualquiera puede establecer valores no válidos
Temperature t = new Temperature();
t.celsius = -500; // Por debajo del cero absoluto - ¡imposible!Con la ocultación de información, usted controla cómo se accede a los datos y cómo se modifican:
public class Temperature {
private double celsius;
public void setCelsius(double celsius) {
if (celsius >= -273.15) {
this.celsius = celsius;
}
}
public double getCelsius() {
return celsius;
}
}Ahora las temperaturas no válidas se rechazan automáticamente. La representación interna está oculta: podrías cambiar más adelante cómo se almacena internamente la temperatura (quizás a Kelvin) sin afectar al código que utiliza la clase.
Este enfoque ofrece tres beneficios clave: validación garantiza la integridad de los datos, flexibilidad permite realizar cambios internos sin romper el código externo, y control le permite decidir exactamente qué operaciones están permitidas en sus datos.
Desafío
FácilVamos a construir una clase de gestión de Password que demuestre la ocultación de información protegiendo datos sensibles y aplicando reglas de seguridad a través del acceso controlado.
Crearás dos archivos para organizar tu código:
Password.java: Crea una clase Password que oculte sus datos internos y controle cómo se pueden establecer y acceder a las contraseñas:- Un campo privado
password(String) que almacena la contraseña real - Un campo privado
minLength(int) que define la longitud mínima aceptable de la contraseña - Un constructor que recibe el requisito de longitud mínima
- Un setter
setPassword(String password)que solo acepta contraseñas que cumplan con el requisito de longitud mínima. Si es válida, almacénala y devuelvetrue; si es demasiado corta, no cambies la contraseña y devuelvefalse - Un getter
getMaskedPassword()que devuelve la contraseña con todos los caracteres reemplazados por asteriscos (*) - ¡nunca expongas la contraseña real! - Un método
checkPassword(String attempt)que devuelvetruesi el intento coincide con la contraseña almacenada,falseen caso contrario - Un getter
getLength()que devuelve la longitud de la contraseña actual (o 0 si no se ha establecido ninguna contraseña)
- Un campo privado
Main.java: Crea un objeto Password con una longitud mínima de 6, luego lee dos entradas: una contraseña para establecer y un intento para verificar. Imprime tres líneas:Set: trueoSet: false(resultado de establecer la contraseña)Masked: ******(la versión enmascarada de la contraseña)Match: trueoMatch: false(resultado de verificar el intento)
Recibirás dos entradas: la contraseña a establecer y el intento de contraseña a verificar.
Observa cómo la contraseña real nunca es accesible directamente desde fuera de la clase; esto es la ocultación de información en acción. La clase controla exactamente qué información se revela y cómo se puede modificar la contraseña.
Hoja de referencia
El ocultamiento de información restringe el acceso directo a los datos internos de un objeto mediante el uso de campos private combinados con getters y setters.
Sin el ocultamiento de información, los campos quedan expuestos y pueden establecerse con valores no válidos:
public class Temperature {
public double celsius; // Expuesto directamente
}
Temperature t = new Temperature();
t.celsius = -500; // Se permite un valor no válidoCon el ocultamiento de información, usted controla el acceso y valida los datos:
public class Temperature {
private double celsius;
public void setCelsius(double celsius) {
if (celsius >= -273.15) {
this.celsius = celsius;
}
}
public double getCelsius() {
return celsius;
}
}Beneficios clave del ocultamiento de información:
- Validación: Garantiza la integridad de los datos al rechazar valores no válidos
- Flexibilidad: Permite realizar cambios internos sin afectar al código externo
- Control: Le permite decidir qué operaciones están permitidas en sus datos
Pruébalo tú mismo
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Leer la contraseña a establecer
String passwordToSet = scanner.nextLine();
// Leer el intento de contraseña para verificar
String passwordAttempt = scanner.nextLine();
// TODO: Crear un objeto Password con una longitud mínima de 6
// TODO: Establecer la contraseña e imprimir el resultado ("Set: true" o "Set: false")
// TODO: Imprimir la contraseña enmascarada ("Masked: ******")
// TODO: Verificar el intento de contraseña e imprimir el resultado ("Match: true" o "Match: false")
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosIntroducción a la OOPClases vs. ObjetosLa palabra clave thisMétodosCampos (Atributos)Método constructorSobrecarga de constructoresResumen - Calculadora simple4Herencia
Herencia básica (extends)La palabra clave superSobrescritura de métodos (@Override)Encadenamiento de constructoresLa clase ObjectHerencia simple y multinivelPor qué no hay herencia múltiple de clasesResumen - Jerarquía de empleados7Métodos especiales y la clase Object
Método toString()equals() y hashCode()Método clone()compareTo() y ComparableInterfaz ComparatorResumen - Ordenamiento personalizado2Modificadores de acceso y encapsulamiento
Visión general de los niveles de accesoMétodos Getter y SetterOcultamiento de informaciónLa palabra clave finalResumen - Gestor de cuentas bancarias5Polimorfismo
Fundamentos de sobrecarga de métodosSobrescritura de métodos (tiempo de ejecución)Upcasting y DowncastingEl operador instanceofClases y métodos abstractosResumen - Calculadora de figuras8Conceptos avanzados de POO
Composición vs. HerenciaAgregación vs. ComposiciónClases internas, anidadas y anónimasEnums y métodos de EnumRecords (Java 16+)Clases selladas (Java 17+)11Patrones de diseño - Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón BuilderPatrón ObserverPatrón Strategy3Propiedades de clase y miembros estáticos
Variables de instancia vs. estáticasMétodos estáticosBloques estáticosConstantes (static final)Repaso - Contador y utilidad6Interfaces y Clases Abstractas
Introducción a las InterfacesImplementación de InterfacesImplementación de Múltiples InterfacesMétodos Default y Static en InterfacesClases Abstractas vs InterfacesInterfaces FuncionalesResumen - Sistema de Pagos9Genéricos
Introducción a los genéricosClases genéricasMétodos genéricosParámetros de tipo delimitadosComodines (?, extends, super)Resumen - Contenedor genérico12Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Iterator