¡Hola! Dedicaremos la lección de hoy a la encapsulación en Java y comenzaremos con ejemplos desde el principio :) Aquí tiene una máquina dispensadora de refrescos ordinaria . Tengo una pregunta para ti: ¿cómo funciona? Trate de dar una respuesta detallada: ¿De dónde viene el refresco? ¿Cómo se mantiene la temperatura interna? ¿Dónde se almacena el hielo? ¿Cómo sabe la máquina qué jarabe agregar? Probablemente no tengas respuestas a estas preguntas. De acuerdo, tal vez no todos usen estas máquinas. No son tan populares en la actualidad. Probemos con otro ejemplo. Algo que definitivamente usas muchas veces todos los días. ¡Ay, tengo una idea! Principios de encapsulación - 2Dime cómo funciona el motor de búsqueda de Googleobras. ¿Cómo busca exactamente información sobre las palabras que ingresa? ¿Por qué estos resultados están en la parte superior y no en otros? Aunque usas Google todos los días, probablemente no lo sepas. Pero eso no importa. Después de todo, no es algo que necesites saber. Puede usar un motor de búsqueda sin pensar exactamente en cómo funciona. Puedes comprar refrescos de una máquina sin saber cómo está construida. Puedes conducir un automóvil sin profundizar en cómo funciona el motor de combustión interna y sin siquiera saber física de la escuela secundaria. Todo esto es posible gracias a uno de los principios fundamentales de la programación orientada a objetos: la encapsulación. Al leer diferentes artículos sobre el tema, debe haber encontrado dos conceptos de programación generalizados: encapsulación y ocultación de información. Da la casualidad de que diferentes personas entienden la palabra ' encapsulación' para significar cosas diferentes. Descifraremos ambos términos para que tengas una comprensión completa. En programación, el significado original dela encapsulación combinaba datos y métodos para trabajar con esos datos en un paquete ("cápsula"). En Java, el paquete de encapsulación es la clase . La clase contiene datos (campos) y métodos para trabajar con esos datos. Principios de encapsulación - 3Esto puede parecerte obvio, pero todo está organizado de manera diferente en otros paradigmas de programación. Por ejemplo, en la programación funcional, los datos están estrictamente separados de las operaciones de datos. En la programación orientada a objetos (POO), los programas consisten en cápsulas (clases) que consisten tanto en datos como en funciones para trabajar con datos.

Ahora hablemos de la ocultación de información.

¿Cómo usamos todo tipo de mecanismos complejos sin entender cómo están construidos o cómo funcionan? Es simple: sus creadores proporcionaron interfaces simples y convenientes. En una máquina de refrescos, la interfaz son los botones del panel frontal. Un botón te permite elegir el tamaño de la copa. El almíbar lo eliges con un segundo botón. Un tercero se encarga de añadir hielo. Y eso es todo lo que necesitas hacer. No importa cómo se vea la máquina por dentro. Lo importante es que está diseñado para que el usuario obtenga gaseosa presionando tres botones. Lo mismo se aplica a un coche. No importa lo que esté pasando dentro. Lo importante es que cuando pisas el pedal derecho el coche avanza, y cuando pisas el pedal izquierdo el coche frena. Esta es la esencia de la ocultación de información. Todo un programa' Las 'entrás' están ocultas para el usuario. Dicha información es superflua o innecesaria para el usuario. El usuario necesita un resultado final, no un proceso interno. Por ejemplo, echemos un vistazo a laClase de vehículo :
public class Vehicle {

   public void gas() {

       /* Some complicated things happen inside a car.
       As a result, it moves forward */
   }

   public void brake() {

       /* Some complicated things happen inside a car.
       As a result, it slows down */
   }

   public static void main(String[] args) {

       Vehicle vehicle = new Vehicle();

       // How everything looks to the user

       // Press one pedal, the car moves
       vehicle.gas();

       // Press the other pedal, the car brakes
       vehicle.brake();
   }
}
Así es como se oculta la implementación en un programa Java. Como en la vida real: al usuario se le proporciona una interfaz (métodos). En un programa, si necesita un automóvil para realizar una acción, simplemente llame al método deseado. Lo que sucede dentro de estos métodos es superfluo. Lo que importa es que todo funcione como debe. Aquí hemos estado hablando sobre la ocultación de la implementación. Java también tiene ocultación de datos. Escribimos sobre esto en la lección sobre getters y setters, pero un recordatorio no está de más. Por ejemplo, tenemos una clase Gato :
public class Cat {

   public String name;
   public int age;
   public int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }


}
¿Quizás recuerdas de una lección anterior cuál es el problema con esta clase? Si no, recordemos. El problema es que sus datos (campos) están abiertos a todos. Otro programador podría crear fácilmente un gato sin nombre con un peso de 0 y una edad de -1000 años:
public static void main(String[] args) {

   Cat cat = new Cat();
   cat.name = "";
   cat.age = -1000;
   cat.weight = 0;

}
En esta situación, podría realizar un seguimiento cuidadoso de si uno de sus colegas está creando objetos con un estado no válido, pero sería mucho mejor eliminar incluso la posibilidad de crear estos objetos no válidos. Principios de encapsulación - 4Logramos la ocultación de datos con la ayuda de:
  1. modificadores de acceso ( privado, protegido, predeterminado del paquete );
  2. captadores y setters.
Los usamos para verificar si alguien está tratando de darle una edad negativa al gato. Como dijimos anteriormente, los autores de varios artículos sobre encapsulación en realidad se refieren a la encapsulación (combinar datos y métodos) o al ocultamiento de información, o a ambas. Java tiene ambos mecanismos (este no es necesariamente el caso en otros lenguajes OOP), por lo que la última opción es la más correcta.

La encapsulación nos da varias ventajas importantes:

  1. Supervisión del estado correcto del objeto. Dimos ejemplos de esto arriba: gracias al setter y al modificador privado , hemos asegurado nuestro programa contra gatos con un peso de 0.

  2. Interfaz amigable. Dejamos solo los métodos expuestos al usuario. El usuario simplemente necesita llamarlos para obtener un resultado. Y no hay necesidad alguna de profundizar en los detalles de cómo funcionan.

  3. Los cambios de código no afectan a los usuarios. Hacemos todos los cambios dentro de los métodos. Esto no afecta a los usuarios: escribieron vehicle.gas() para aplicar el gas, y eso es lo que seguirán haciendo. El hecho de que hayamos cambiado algo dentro del método gas() permanece invisible: como antes, simplemente obtienen el resultado requerido.