1
respuesta

Encapsulamiento, Getter y Setters

*Encapsulamiento *

El encapsulamiento es un mecanismo que nos ayuda a proteger los atributos de una clase para que no puedan ser accedidos por cualquier entidad.

Tomemos de ejemplo la siguiente clase:

public class Animal{

    public String nombre; // Atributo nombre, de tipo String, modificador de acceso público.
    public int edad; // Atributo edad, de tipo entero, modificador de acceso público.

    public Animal(){ // Constructor vacío, que permite la instanciación vacía de esta clase como objeto.
    }

    // Método que no retorna ningún valor, y que imprime por pantalla "Grraaah!".
    public void emitirSonido(){
        System.out.println("Grraaah!");
    }
}

Nuestra clase Gato posee dos atributos públicos, nombre y edad. Estos atributos pueden ser accedidos desde cualquier parte, por lo cual podemos manipular esta información desde cualquier lado, como se muestra a continuación en la clase EntrenarAnimal:

public class EntrenarAnimal{

    public static void main(String[] args){

        Gato garfield = new Gato(); // Se crea una instancia de tipo Gato, un objeto.

        garfield.nombre = "Garfield"; // Se establece el nombre del gato.
        garfield.edad = 4; // Se establece la edad del gato.

        System.out.println("El gato se llama " + gato.nombre + ", tiene " + gato.edad + " años, y dice ");
        gato.emitirSonido();
    }
}

Sin ningun problema aparente, podemos modificar a gusto los atributos del objeto Gato que hemos creado en la clase EntrenarAnimal. Sin embargo, esto es bastante peligroso porque no hay forma de poder controlar la modificación de estos atributos. Cualquier método puede modificar estos valores, incluso accidentalmente y no podemos obtener ningun tipo de información que nos alerte sobre esto.

Para evitar este problema debemos recurrir a la encapsulación, proceso mediante el cual podemos proteger nuestros atributos. Veamos cómo quedaría la clase Gato si encapsulamos sus atributos:

public class Animal{

    private String nombre; // Atributo nombre, de tipo String, modificador de acceso privado.
    private int edad; // Atributo edad, de tipo entero, modificador de acceso privado.

    public Animal(){ // Constructor vacío, que permite la instanciación vacía de esta clase como objeto.
    }

    // Método que no retorna ningún valor, y que imprime por pantalla "Grraaah!".
    public void emitirSonido(){
        System.out.println("Grraaah!");
    }

    public void setNombre(String nombre){ // Método Setter para manipular el atributo nombre de forma segura.
        this.nombre = nombre;
        System.out.println("Se ha modificado el nombre del Gato a: " + nombre);
    }

    public String getNombre(){ // Método Getter para obtener el atributo nombre de forma segura.
        return this.nombre;
    }

        public void setEdad(int edad){ // Método Setter para manipular el atributo edad de forma segura.
        this.edad = edad;
        System.out.println("Se ha modificado la edad del Gato a: " + edad);
    }

    public int getEdad(){ // Método Getter para obtener el atributo edad de forma segura.
        return this.edad;
    }
}

Ahora ya no podemos acceder a los atributos de la clase Gato porque son privados. Veamos cómo tendríamos que hacerlo desde la clase EntrenarAnimal:

public class EntrenarAnimal{

    public static void main(String[] args){

        Gato garfield = new Gato(); // Se crea una instancia de tipo Gato, un objeto.

        garfield.setNombre("Garfield"); // Se establece el nombre del gato.
        garfield.setEdad(4); // Se establece la edad del gato.

        System.out.println("El gato se llama " + gato.getNombre() + ", tiene " + gato.getEdad() + " años, y dice ");
        gato.emitirSonido();
    }
}

De esto podemos entender lo siguiente:

  • Los atributos del Gato pasaron de ser públicos (de libre acceso) a privados (acceso solo para los miembros de la clase).
  • Como los atributos ahora solo pueden ser accedidos por la misma clase, es necesario hacer uso de los métodos Setter y Getter desde fuera de la clase para poder manipularlos y obtenerlos.
  • Este mecanísmo nos permite agregar lógica a los métodos Getter y Setter para tener control sobre nuestros atributos, saber cuándo se utilizan, cómo y de esta forma conseguir que nuestros datos estén seguros siempre.

Espero que con este ejemplo y esta explicación, ya tengas más claridad sobre las virtudes del encapsulamiento y los métodos Setter y Getter.

1 respuesta

Hola Jorge, cómo estás?

Gracias por continuar compartiendo tus conocimientos en el foro.

Felicitaciones, continua así aprendiendo, saludos.

Si tienes alguna duda sobre el contenido de los cursos, estaremos aquí para ayudarte.

Si este post te ayudó, por favor, marca como solucionado ✓. Continúa con tus estudios