Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
2
respuestas

DUDA SOBRE ACCESO Y ENCAPSULAMIENTO

Buenos días, si tengo el siguiente codigo:

class Cuenta {
    private double saldo;
    private int agencia;
    private int numero;
    Cliente titular = new Cliente();

    public void depositar(double valor) {

        this.saldo += valor;

    }

    public boolean retirar(double valor) {

        if (this.saldo >= valor) {

            this.saldo -= valor;

            return true;
        }

        return false;

    }

    public boolean transferir(double valor, Cuenta cuenta) {

        if (this.saldo >= valor) {

            this.saldo -= valor;

            cuenta.depositar(valor);

            return true;

        }

        return false;
    }

    public boolean transfiere(double valor, Cuenta destino) {

        retirar(valor);

        destino.depositar(valor);

        return true;

    }

    public double getSaldo() {

        return this.saldo;
    }

    public void setAgencia(int agencia) {

        if (agencia > 0) {

            this.agencia = agencia;

        } else {

            System.out.println("No estan permitidos valores negativos");
        }
    }

    public int getAgencia() {

        return this.agencia;
    }

    public void setTitular(Cliente titular) {
        this.titular = titular;
    }
    }

El atributo de tipo "Cliente" (un objeto) definido al comienzo carece de un tipo de acceso "private", sin embargo de acuerdo a lo visto en la clase 6 ("Encapsulamiento y visibilidad") la unica manera de poder inicializar, modificar o mostrar el valor de diho atributo es mediante "get" y "set". ¿cual es la razon de esto ultimo) ya que, segun lo que entendí, si no se define el tipo de acceso, por defecto seria "public".

Cualquier orientacion que me puedan brindar sera bienvenida.

Saludos!

2 respuestas

Hola, Alumno, si no se define el tipo de acceso, por defecto, sería "default", que es más restrito que public. Saludos!

*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.