Encapsulamiento en Programación Orientada a Objetos: El Control de Acceso a Datos

Carlos BarriosCarlos Barrios
7 min read

Introducción: generalidades del encapsulamiento

En el mundo de la programación, proteger los datos y controlar cómo se accede a ellos es fundamental. ¿Te imaginas un programa donde cualquier parte del código pueda modificar tu contraseña o saldo bancario? Sería un caos. Aquí es donde entra en juego el encapsulamiento.

El encapsulamiento es un principio que se basa en buscar la integridad de la información interna de una clase, con el fin de proteger esos datos y controlar el acceso a dicha información, según sea el nivel de restricción que le queramos dar.

En este artículo, nos enfocamos en cómo se implementa el encapsulamiento en Java, nuestro lenguaje favorito, pero ten en cuenta que este concepto es universal y aplica a otros lenguajes. Aunque cada lenguaje tiene sus variaciones y reglas, las bases son exactamente las mismas.

Modificadores de acceso: las llaves del encapsulamiento

Los modificadores de acceso son palabras claves que definen cómo y desde dónde se puede acceder a los atributos y métodos de una clase. Aunque existen variaciones según el lenguaje, los tres más comunes y generales son:

  1. Público (public)

  2. Protegido (protected)

  3. Privado (private)

A continuación, veremos cada uno en detalle, con ejemplos en Java.

Público: sin restricciones

Los atributos y métodos marcados como públicos pueden ser accedidos y modificados en cualquier parte del programa, sin restricciones. Este modificador se suele utilizar en partes del código que se espera sean reutilizadas, como se muestra en la siguiente ejemplo.

En la imagen 1, se muestra la clase Conversor, la cual contiene la funcionalidad de convertir unidades de tiempo, como minutos a segundos o horas a segundos. En la parte izquierda del editor de código, se observa que las clases están organizadas en diferentes paquetes. Sin embargo, esto no afecta su accesibilidad, ya que se puede acceder a ellas desde cualquier parte del código, independientemente de su ubicación.

Imagen 1. Clase conversor.

En la imagen 2, se muestra la creación del objeto conversorTiempo y se llaman sus respectivos métodos públicos en la clase Main, por ultimo se guardan esos valores en variables para ser mostrados en consola.

Imagen 2. Clase main.

Protegido: nivel medio de restricción

Por otro lado, el modificador de acceso protegido permite que los atributos y métodos de una clase sean accesibles desde otras clases que se encuentren en el mismo paquete o desde subclases que hereden de ella. Esto significa que cualquier clase que extienda la clase donde se definieron esos atributos o métodos podrá acceder a ellos.

Es importante mencionar que la herencia es otro pilar fundamental de la programación orientada a objetos. Este tema se aborda en otro artículo dentro de este mismo blog. Sin embargo, si no se está familiarizado con este término, basta con saber que se utiliza la palabra clave extends en la firma de la clase, seguida del nombre de la clase que se desea tomar como base. Esto permite reutilizar o sobrescribir métodos, con una implementación distinta si así se requiere.

En el siguiente video puedes encontrar más información acerca de la herencia:

En la imagen 3, se observa la clase llamada Instrumento, que contiene un método llamado tocarNota. Esta funcionalidad puede ser reutilizada por clases que hereden de Instrumento, como Guitarra en la imagen 4 y Piano en la imagen 5. En este caso, no se sobrescribió el método tocarNota, sino se utilizó dentro de nuevos métodos (tocarAcorde y tocarMelodia) en las subclases. Esto permite reutilizar la funcionalidad sin modificar su implementación original.

Imagen 3. Clase instrumento.

Imagen 4. Sub Clase guitarra.

Imagen 5. Clase piano.

Privado: nivel máximo de restricción

Finalmente, el modificador de acceso privado es el más restrictivo, ya que solo permite acceder a los atributos y métodos dentro de la misma clase donde fueron definidos. Esto ayuda a proteger los detalles internos, ya que son invisibles para otras clases.

En los ejemplos anteriores, hemos visto cómo aplicar modificadores de acceso en métodos. Ahora, veremos su uso en atributos, aunque es importante destacar que estos modificadores pueden aplicarse tanto a métodos como a atributos.

En la figura 6, se muestra la clase UsuarioBanco, la cual contiene atributos como pin y saldo. Estos atributos están marcados como private, lo que significa que no pueden ser accedidos ni modificados directamente desde fuera de la clase. Sin embargo, su acceso puede ser controlado de manera segura mediante métodos especiales conocidos como setters y getters, un tema que exploraremos en la siguiente sección.

Imagen 6. Clase UsuarioBanco.

El cuadro 1 resume cada uno de los modificadores de acceso más comunes en varios lenguajes de programación, junto su nivel de restricción.

Cuadro 1. Comparación de modificadores de acceso

ModificadorAcceso a la misma claseAcceso en subclaseAcceso en otras clases (mismo paquete)Acceso en otras clases (diferente paquete)
Público
ProtegidoNo
PrivadoNoNoNo

Getters y setters: acceso seguro a atributos privados

Como se mencionó anteriormente, los atributos privados no pueden modificarse directamente desde fuera de la clase. Sin embargo, los getters y setters permiten acceder o modificar esos valores de manera controlada. Entonces, ¿cómo es que el modificador de acceso privado mantiene el encapsulamiento si de todas formas se puede cambiar y obtener el valor de dicho atributo?

La respuesta a esa pregunta es bastante sencilla. Los getters y setters son métodos públicos que facilitan el acceso y la modificación de atributos privados de forma controlada, ofreciendo la flexibilidad necesaria para establecer reglas personalizadas dentro de ellos. De este modo, se mantiene el principio de encapsulamiento, ya que se controla el acceso a la información por medio de estas herramientas.

Estos métodos suelen tener en su firma la palabra “get” que significa obtener, y es precisamente su función, retornar el valor. Por otro lado, el “set” se usa para establecerlo o actualizarlo.

En la imagen 7, la clase Usuario incluye atributos como el nombre y el correo electrónico. En la imagen 8 se identifican cuatro métodos: dos de ellos son getters, donde el primero retorna el valor del nombre y el segundo el del correo electrónico. Los dos métodos restantes se dedican a actualizar valores. En el caso de setNombre, se implementan validaciones previas para evitar que se asignen valores vacíos. Por otro lado, el método setCorreoElectronico valida que el valor no contenga espacios.

Imagen 7. Atributos de la clase usuario.

Imagen 8. Getters y setters de la clase usuario.

En la imagen 9, se observa la creación de un usuario, la asignación de nuevos valores y su visualización mediante los métodos getters y setters definidos en la clase Usuario. En la parte inferior, la consola muestra los resultados: el nombre se estableció correctamente, pero el correo no pudo ser asignado debido a que no cumple con las validaciones implementadas en el método setCorreoElectronico de la clase Usuario. Este ejemplo demuestra la importancia de controlar qué agentes externos pueden acceder o modificar la información de un objeto, garantizando su integridad y seguridad.

Aunque no son obligatorios, los getters y setters son una práctica común en POO para mantener el control sobre los atributos privados. En algunos casos puede ser necesario que un atributo sea accesible pero no modificable, por lo que solo se utilizaría un getter. En otras situaciones, podría requerirse únicamente un setter, o incluso ambos, dependiendo de las necesidades específicas.

¿Por qué usar getters y setters?

  1. Permiten mantener el control sobre un atributo, ya que es posible definir validaciones o transformar su valor antes de actualizarlo o devolverlo.

  2. Ofrecen flexibilidad para futuras modificaciones, ya que la lógica de acceso y modificación de un atributo privado se centraliza en los métodos getter y setter.

Conclusión

El encapsulamiento es un pilar fundamental de la programación orientada a objetos, diseñado para proteger y estructurar el código, optimizando su eficiencia. A través de los modificadores de acceso, junto con los getters y setters, podemos gestionar de manera precisa cómo se accede y se modifican los atributos y métodos de una clase. Esto no solo contribuye a la creación de código robusto y seguro, sino que también facilita su mantenimiento. Así, nos preparamos para enfrentar retos más complejos en el desarrollo de software. ¿Estás listo?

0
Subscribe to my newsletter

Read articles from Carlos Barrios directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Carlos Barrios
Carlos Barrios