Encapsulamiento en Java


Anteriormente hemos hablado del encapsulamiento sin ahondar mucho en el tema. En este artículo vamos a profundizar un poco más.

Imaginemos que se crea una clase, una docena de programadores tienen acceso a dicha clase y la utilizan a discreción, posteriormente dicha clase comienza a comportarse de una manera inesperada debido a que los valores que algunas variables han tomado no fueron anticipados y todo comienza a desmoronarse. Para corregir el problema se crea una versión más nueva de dicha clase y listo.

Bueno, a esto le llamamos flexibilidad y capacidad de mantenimiento, ambas son características y beneficios de la programación Orientada a Objetos (OO) pero para que una clase pueda cumplir dichas funciones los programadores debemos de hacer algo. Imaginemos que creamos una clase con variables de instancia públicas a las cuales podemos acceder sin problemas desde fuera de la misma clase...

public class MiClase{
public int tipo;

}


class AccesoDirecto{

public static void main(String[] args){

MiClase mc = new MiClase();


mc.tipo = -5; //1

}
}


Analizando el código anterior podemos darnos cuenta de que las variables enteras tipo y clase son públicas y pueden ser accedidas directamente a través de una instancia de la clase MiClase, esto compila sin ningún problema, digamos que es 'legal', sin embargo, ¿qué pasa si ingresamos un valor que no se supone debe de tener una variable (en este caso el -5 que le asignamos a tipo)?, simplemente no hay nada que nos detenga para hacerlo. La única manera de proteger el código es escribiendo un método que nos permita regular los valores que cada variable puede tener y escondiendo las variables para que no se pueda acceder a ellas de manera directa, esto es el principio básico de encapsulamiento.

Si se desea flexibilidad, buen mantenimiento y extensibilidad, nuestro diseño en el código debe de incluir encapsulamiento, para ello debemos de hacer lo siguiente:

* Mantener las variables de instancia protegidas (puede ser con un modificador de acceso, p.ej., private)
* Hacer métodos de acceso públicos para forzar al acceso a las variables por medio de dichos métodos en lugar de acceder directamente.
* Utilizar las convenciones de código para los nombres de los métodos, p. ej., set y get.

El ejemplo anterior modificado para un buen encapsulamiento quedaría así:

public class MiClase{
private int tipo;

public void setTipo(int t){
tipo = t;
}


public int getTipo(){

return tipo;

}

}


class AccesoIndirecto{


public static void main(String[] args){
MiClase mc = new MiClase();

mc.setTipo(5);
System.out.println("El tipo es:" + mc.getTipo());

}


}


Si nos fijamos un poquito, en el método setTipo() no existen validaciones para prevenir que un valor no válido sea asignado a la variable, sin embargo, el proveer de un método de este tipo desde el diseño inicial de la aplicación nos permite posteriormente modificar el comportamiento de la misma sin afectar los métodos utilizados, tal vez en un futuro se desee que dicha variable solamente pueda tener uno entre un rango de valores y se podrán aplicar posteriormente los cambios sin que haya repercusiones negativas.

Esto es todo con respecto al encapsulamiento. ¿Alguna duda? deja tu comentario.

Más sobre programación en Java aquí.

40 comentarios:

  1. Anónimo dijo...:

    muy bien por la informacion es muy entendible
    tanto por la definicion como el ejemplo

    muy bien

  1. Anónimo dijo...:

    GRACIAS POR LA EXPLICACION BIEN

  1. Monillo007 dijo...:

    Gracias, sus comentarios me hacen pensar que estoy cumpliendo mi propósito.

    Saludox

  1. Anónimo dijo...:

    muy bien por ti.. por que si es entendible todo..
    pero como aplica java el encapsulamiento

  1. Adolfo dijo...:

    esta muy bien eso por que
    es facil de entender
    yo no no entendia muy bien lo
    del encapsulamiento y esto me ayudo
    gracias.

  1. Monillo007 dijo...:

    Gracias por sus comentarios. Saludox.

  1. Anónimo dijo...:

    Ese programa no me corre.
    No me marca errores, pero no hace nada

  1. Monillo007 dijo...:

    Qué tal!

    necesitaría ver el código para poder indicarte algo, si deseas mándamelo al correo para echarle un vistazo. monillo007@gmail.com

  1. Anónimo dijo...:

    Excelente explicación!

  1. Lothar dijo...:

    Muy buena la explicacion me ha ayudado a la hora de entender lo que es la encapsulacion en Java y gracias al ejemplo creo que voy a poder prograrlo en mi codigo.

    Ciao, Lothar

  1. Francko dijo...:

    Hola:
    Comentas que no hay validación en el metodo setTipo() para prevenir un valor no valido, pero al declarar la variable:
    private int tipo;
    El definir el tipo de dato int, ¿el metodo sabe que solo recibira numeros?

  1. Monillo007 dijo...:

    Que tal Francko,

    Te comento que el método automáticamente detecta que el parámetro que recibirá es un entero, de lo contrario el compilador manda un error.

    A lo que me refiero con que no se valida para prevenir un valor no válido es que, por ejemplo, para el correcto funcionamiento de tu aplicación la variable tipo debe de tener un valor entre 5 y 10, y, en este ejemplo, cualquier valor entero pasado a setTipo() se toma como válido.

    Espero haberme explicado. Saludox.

  1. Anónimo dijo...:

    no me gusta los que dicen algo sin saber bien de lo que están ablando

  1. Slater dijo...:

    Muy buena y clara la explicación, muchas gracias por compartirla.

  1. Anónimo dijo...:

    Me parece bueno que pongas este tipo de explicaciones para quienes empiezan en Java, pero creo que deberias ser un poco mas honesto ya que esa explicación la sacaste del libro SCJP Sun Certified Programmer for Java 6 Study Guide. Viene en el capitulo dos. Es bueno que ayudes pero dale credito a quien lo merece.

  1. He repasado lo que habia dicho el profe sobre esto y ceros. Con tu explicacion ya he quedado. Lo que no me agrada en cuanto a la encapsulacion es usar las convenciones de codigo para los metodos, usar el get o set, hablo español, y aunque el lengvua tenga todas sus palabras reservadas en ingles, me es mas facil poner las variables y metodos lo mas descriptivo posible ne español. Saludos

  1. Anónimo dijo...:

    muy bien gracias

  1. edwin dijo...:

    Esta bien claro todo, gracias

  1. Anónimo dijo...:

    muchas gracias

  1. Anónimo dijo...:

    Excelente, por fin entendí esta cuestión...

  1. Anónimo dijo...:

    Muchas gracias amigo
    te entendi mas que mi maestra.\hah un 10

  1. Anónimo dijo...:

    est biuen el codigo gracias ojala no me quede en esa materia?????
    :(
    :'(

  1. Anónimo dijo...:

    ok esta bueno

  1. Anónimo dijo...:

    Gracias me ha ayudado es mu claro

  1. Anónimo dijo...:

    Me ggusta como explica, muy sencillo para tener la idea basica del tema de encapsulamiento.... gracias

  1. Anónimo dijo...:

    No entiendo porque inventaron el encapsulamiento, si las dos formas se puede alterar el valor de la variable, con la diferencia que en el encapsulamiento ocupa mas codigo. Cual es la razon de utilizarla.

  1. Monillo007 dijo...:

    La razón de ser del encapsulamiento es principalmente limitar o denegar el acceso directo a la variable u objeto, si utilizas un método para acceder a ella podrás dentro del método realizar ciertas validaciones o establecer un comportamiento en particular cuando se modifica o se intenta modificar su valor.

    Por ejemplo, digamos que tienes una variable que te almacenará la edad de una persona, si no utilizas el encapsulamiento cualquiera que tenga acceso a esa variable podrá establecer cualquier valor, incluyendo números negativos aún cuando la edad no puede ser representada de esa manera, en caso de que utilices un método público para modificar el valor de esa variable privada (encapsulamiento) podrás limitar el rango de valores que puede tener y por lo tanto, garantizarás que siempre tendrá un valor real.

    Espero haberme explicado un poco más. Saludox.

  1. Anónimo dijo...:

    vien por la explicacion me sera de mucha ayuda

  1. space dijo...:

    Despues de 3 años estudiando ciencias de la computacion. Gracias a este articulo entendi por fin el Encapsulamiento en JAVA. =D, muchas gracias

  1. Anónimo dijo...:

    Excelente explicación, clara y concisa

  1. Anónimo dijo...:

    ¿Que se usa para encapsular? ¿un metodo o un costructor?
    Gracias

  1. Monillo007 dijo...:

    Para encapsular utilizas 2 cosas:
    - Variables privadas.
    - Métodos públicos.

    Saludox.

  1. Anónimo dijo...:

    graxias
    me sirvio bastante

  1. Frandy dijo...:

    Gracias por el aporte. Lastima que lo vengo a leer tres años despues de que fue publicado.

  1. Anónimo dijo...:

    bveno si as o menos se entendio ps ..
    pero
    me gvstaria
    q pongan ,mas ..
    ejemplos y ais poder comprender mejor grasias..

  1. Anónimo dijo...:

    xvr x el dato!

  1. Anónimo dijo...:

    que bueno gracias paraguay

  1. Anónimo dijo...:

    buen aporte se agradece

  1. Gracias. Una explicación clara y concisa.

Publicar un comentario

Este es un espacio abierto, puedes escribir lo que gustes respetando los siguientes puntos:

1.- Lo que escribas esté relacionado con el post, si gustas contactarme puedes hacerlo aqui.

2.- Todo es cuestionable, aunque ten en cuenta que existen formas de hacerlo, evita las agresiones y revisa tu lenguaje antes de publicar un comentario.

3.- Siempre hay tres verdades: tu verdad, mi verdad y la verdad, por lo que opiniones diferentes no necesariamente son equivocadas.

4.- Los comentarios son una forma de discusión abierta, por lo que al publicar uno, implícitamente entras a una discusión, con todo lo que esto representa.

5. Me reservo el derecho de eliminar comentarios que no respeten las condiciones mencionadas anteriormente.

Toma en cuenta que puedes utilizar emoticones en tu comentario, para ver una lista de los disponibles da clic en este enlace.

 
Monillo007 © 2010 | Designed by Trucks, Manual Bookmarking | Elegant Themes