24. Java: encapsulacion (private, public y protected) y getter/setters.
Encapsulación: uno de los principios de la POO
El código de una aplicación informática es algo cambiante.Las especificaciones de una aplicación informática son constatemente susceptibles de cambio, y por tanto su código. Imaginemos por ejemplo el software de la Seguridad Social: las especificaciones de dichos programas están sujetas a los cambios en la legislación.
Por otra parte, como ya sabemos el código de una aplicación OO, está compuesta de clases. En en el interior de las clases se instancian objetos de otras clases, estableciendose así una dependencia entre ellas. Es decir: si realizamos cambios en los atributos o métodos de una clase, es probable que en la clase donde estamos haciendo uso de ella, haya que realizar cambios también que permitan adaptar el código de la segunda a los cambios de la primera.
Será por tanto, una buena estrategia, intentar minimizar esa dependencia que pueda existir entre las clases, de manera que la relación sea lo más holgada posible. De esta manera, posibles cambios en las clases generarán un menor número de errores en el software.
Para concretar una poco más nuestra estrategía, podríamos minimizar el número de elementos a los que se puede acceder. De manera con tranquilidad módificarlos, con un menor riesgo de que dicho cambio pueda probocar fallos en otras clase de nuestro programa.
La encapsulación consiste en "aislar" parcialmente a los objetos, de manera que cuando se instancien en otra clase, solamente sean accesibles unos cuantos de sus elementos. En general, los elementos que van a dejar dejar de ser accesibles desde otras clases, serán los atributos. Y dejaremos accesible los métodos.
![]() |
| Representación de la encapsulación de una clase en POO |
Para implementar este comportamiento en nuestras clases Java, declararemos los elementos de esta manera:
- Los atributos o propiedades, los declararemos "privados" a través de la palabra clave "private". De manera que sólo serán accesibles desde dentro de la propia clase.
- Y los métodos los declararemos "públicos" a través de la palabra "public", de manera que serán accesibles desde cualquier otra clase donde los estemos importando.
Veamos un ejemplo. En la clase "Lugar", los atributos han sido declarados "private", pero el constructor ha sido declarado "public":
De esta manera, obtendremos un error si intentamos referirnos a alguno de los atributos de la clase "Lugar" desde fuera de la clase "Lugar". Por ejemplo para establecer un valor:
//esta sentencia da error desde fuera de la clase "Lugar"
lugar.nombre = "Alcalá de Henares";
o para recuperar su valor y asignarselo a otra variable:
//esta sentencia da error desde fuera de la clase "Lugar"
String nombre = lugar.nombre;
Tambien vemos, que accedemos a los atributos de "Lugar" desde dentro de la clase, en este caso desde el interior del constructor.
Podríamos decir también, que la encapsualción es una manera que crear hermetismo en nuestros objetos de manera que podamos cambiar sus atributos y métodos, minimizando los riesgos que pueden provocar dichos cambios. En general, como hemos dicho antes, la manera de actuar será haciendo no-accesibles los atributos salvo desde dentro de la propia clase, y accesibles los métodos.
La encapsulación es uno de los fundamentos de la POO.
Las interfaces se crean para exponer el funcionamiento de algo, de modo que hagamos como "transparente" para el usuario los mecanismos internos. A través de la encapsulación, lo que estamos creando es una interfaz para manejar el objeto, compuesta de los métodos del objeto.
![]() |
| Representación del principio de encapsulación en POO |
Acceder a los atributos de una clase: los "getters" y los "setters"
Acabamos de ver, que, en general, si aplicamos el principio de encapsulación, no podremos acceder directamente a los atributos de un objeto desde fuera de la clase donde se declarán.¿Como accederemos a ellos entonces? Para acceder a los atributos crearemos los llamados métodos "setters" y "getters".
Ejemplo: para la clase "Lugar" y sus atributos "nombre" y "direccion" por ejemplo, vamos a crear los suguientes "setters" y "getters":
Como se puede ver, los métodos "getNombre()" y "getDireccion()" ("getters") recuperan el valor de los atributos "nombre" y "direccion", y "setNombre()" y "setDirección()" ("setters") asignan valores a dichos atributos.
A través de estos métodos podremos acceder a los atributos desde cualquier clase de nuestra aplicación:
Lugar lugar = new Lugar("Alcala de Henares", "Mayor 33");
//esto recupera el valor del atributo "nombre"
String nombre = lugar.getNombre();
String direccion = "Plaza Santos Niños";
//seto establece el valor del atributo "direccion"
lugar.setDireccion(direccion);
Elementos de tipo "protected"
Acabamos de ver, que las palabras clave "public" y "protected" establecen la llamada "visibilidad" de los elemento de un clase.Existe un tercer tipo de visibilidad llamado "protected". Aquellos elementos de tipo protected serán accesibles dentro de su propia clase y ademas:
"dentro de las clases derivadas".
Veremos lo que son las clases derivadas y el mecanismo de herencia en el siguiente capítulo.
Otro enlaces:
https://softwareengineering.stackexchange.com/questions/244476/what-is-decoupling-and-what-development-areas-can-it-apply-to
https://stackoverflow.com/questions/13913174/encapsulation-vs-information-hiding
https://en.wikipedia.org/wiki/Information_hiding
https://en.wikipedia.org/wiki/Coupling_(computer_programming)
https://en.wikipedia.org/wiki/Connascence_(computer_programming)
https://en.wikipedia.org/wiki/Loose_coupling
https://en.wikipedia.org/wiki/Cohesion_(computer_science)





Comentarios
Publicar un comentario