Saltar al contenido principal

Encapsulamiento: modificadores de acceso

Una clase es visible por otra dependiendo de si están en el mismo paquete y los modificadores de acceso que utilice. Estos alteran la visibilidad, permitiendo que se muestre u oculte.

De igual manera que podemos modificar la visibilidad entre clases, es posible modificar la visibilidad a nivel de atributos y métodos que son visibles para otras clases.

Modificadores de acceso para clases

Dos clases cualesquiera pueden definirse como:

  • Clases vecinas: cuando ambas están en el mismo paquete.
  • Clases externas: en el caso de que se encuentren definidas en paquetes distintos.

Ver una clase significa poder crear objetos de ella o poder acceder a sus atributos y métodos estáticos. Tenemos varias maneras de definir las visibilidades de clases:

  • Visibilidad por defecto: Cuando definimos una clase sin ningún modificador de acceso:

    package paquete1;

    class A { // sin modificador de acceso
    //...
    }

    Solo es visible para sus clases vecinas.

  • Visibilidad total: En el caso anterior, la clase A es invisible para todas las clases externas. Para hacerla visible podemos utilizar el modificador de acceso public. Cualquier clase pública será visible desde cualquier clase externa mediante importación.

    Modificamos la clase A para que sea visible por las clases externas:

    package paquete1;

    public class A { // clase marcada como pública
    //...
    }

    Lo único que necesita ahora una clase externa para poder utilizar la clase A es importarla:

    import paquete1.A; // importamos la clase A

    class C {
    //....
    }

    Podemos importar todas las clases de un paquete mediante un asterisco *:

    import paquete1.*; // podemos utilizar cualquier clase pública del paquete1

    class C {
    //....
    }

Modificadores de acceso para atributos y métodos

Podemos regular la visibilidad de los atributos y métodos de una clase.

  • Que un atributo sea visible significa que podemos acceder a él, tanto para leerlo como para modificarlo.
  • Que un método sea visible significa que se puede invocar.

Todos los atributos y métodos siempre son visibles dentro de la propia clase independientemente del modificador de acceso utilizado. Tenemos tres tipos de visibilidad:

  • Por defecto.
  • Privada (private).
  • Pública (public).

Visibilidad por defecto

La visibilidad por defecto es aquella que aplica a atributos y métodos declarados sin ningún modificador de acceso. Esta visibilidad implica que un atributo y método es visible desde las clases vecinas, pero invisible desde las clases externas:

public class A { //clase pública
int a; //visibilidad por defecto
}

Por ejemplo, el atributo a es visible para las clases vecinas. En cambio, es invisible para clases externas. Es decir, una clase externa puede acceder a la clase A, pero no al atributo a.

Visibilidad privada

Con el modificador private obtenemos una visibilidad más restrictiva que por defecto, ya que impide el acceso incluso para clases vecinas. Un atributo o método privado es invisible desde fuera de la clase.

public class A { //clase pública
private int a; //visibilidad privada
}

El uso de private está justificado cuando queremos controlar los cambios de un atributo o cuando deseamos que no se conozca su valor, o bien cuando queremos que un método solo sea invocado por métodos de la propia clase, pero no desde fuera de ella.

Visibilidad pública

Con el modificador public hacemos que un atributo o método sea visible incluso desde clases externas. Otorga visibilidad total.

public class A { //clase pública
public int a; //visibilidad pública
}

Recomendación de modificadores de acceso para atributos y métodos

La elección de los modificadores de acceso para atributos y métodos en Java es crucial para garantizar un buen diseño del software, promoviendo la encapsulación y la seguridad.

Recomendaciones sobre cómo utilizar los diferentes modificadores de acceso:

  • Los atributos deben ser declarados como private siempre que sea posible. Esto oculta los atributos de la clase y evita que se modifiquen directamente desde fuera de la clase.

    public class Persona {
    private String nombre; // Atributo privado
    }
  • Los métodos que deben ser accesibles desde otras clases deben ser declarados como public. Estos métodos forman la interfaz pública de la clase y deben estar bien definidos para que otros puedan utilizarlos correctamente.

    public class Persona {
    public void presentar() { // Método público
    System.out.println("Nombre: " + nombre);
    }
    }
  • Los métodos que solo deben ser utilizados internamente dentro de la clase deben ser declarados como private. Esto permite encapsular la lógica que no debería ser accesible desde fuera.

    private void calcularEdad() { // Método privado
    // Lógica interna
    }