Los modificadores de acceso de clases, propiedades y métodos en Java

Escrito por picodotdev el , actualizado el .
java planeta-codigo programacion
Enlace permanente Comentarios

Uno de los principios básicos de los lenguajes orientados a objetos es la encapsulación, mediante la cual se garantiza que los datos de una clase solo son modificados por las operaciones apropiadas implementadas en los métodos de sus clases para preservar su invariante, las reglas que define la clase y el estado consistente de su estado.

El acceso a las propiedades y métodos se determina mediante las palabras reservadas de los modificadores de acceso, en Java hay cuatro modificadores de acceso que definen ámbitos de visibilidad de más restrictivos a menos restrictivos:

  • private: únicamente la clase puede acceder a la propiedad o método.
  • package private (valor por defecto si no se indica ninguno): solo las clases en el mismo paquete pueden acceder a la propiedad o método.
  • protected: las clases del mismo paquete y que heredan de la clase pueden acceder a la propiedad o método.
  • public: la propiedad o método es accesible desde cualquier método de otra clase.

Las clases tienen uno de los modificadores de acceso public o package private con el mismo significado que en las propiedades y métodos, visibles desde cualquier otro paquete y solo visible desde su propio paquete.

Los modificadores de acceso son una palabra reservada del lenguaje y se colocan delante de la propiedad o método, el modificador de acceso package private no tiene palabra reservada se aplica en caso de que no se especifique un modificador de acceso explícitamente.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package io.github.picodotdev.blogbitix;

public class Foo {

  private String property1;
  String property2;
  protected String property3;
  public property4;

  public String getProperty1() {
     return this.format;
  }

  String getProperty2() {
     return property2;
  }

  protected String getProperty3() {
     return property3;
  }

  private String getProperty4() {
     return property4;
  }
}
Foo.java

Los ámbitos de visibilidad según el modificador de acceso y el origen de acceso a la propiedad o método son los siguientes.

Modificador de acceso Misma clase o anidada Clase en el mismo paquete Clase que hereda en otro paquete Clase que no hereda en otro paquete
private No No No
default (package private) No No
protected No
public

En este gráfico hay representados paquetes que contienen clases, clases con rectángulos, las flechas indican herencia entre clases y las clases que están coloreadas indican que tienen visibilidad de la propiedad y método según el ámbito de acceso, la ubicación de la clase que accede y si hay una relación de herencia. En esencia es la misma información de la tabla pero representada de forma gráfica.

Modificadores de acceso en Java
Fuente: wikipedia.org

Una detalle a tener en cuenta es que los modificadores afectan a las clases, una propiedad privada de una clase es accesible para todas las instancias de esa clase. En concreto, este código es válido y el resultado es two, bar1 puede acceder a la propiedad thing de la instancia bar2 aún siendo privada en la clase.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package io.github.picodotdev.blogbitix;

public class Bar {

   private String thing;

   public void Bar(String thing) {
       this.thing = thing;
   }

   public String getOtherThing(Bar other) {
       return other.thing;
   }

   public static void main(String[] args) {
       Bar bar1 = new Bar("one");
       Bar bar2 = new Bar("two");

       String thing = bar1.getOtherThing(bar2);

       System.out.println(thing);
   }
}
Bar.java

No hay encapsulación entre las instancias de la misma clase, la encapsulación es para la clase accedida desde otras clases según los modificadores de acceso. Pero aunque una instancia tenga acceso y capacidad de modificar las propiedades de otra instancia se ha de seguir manteniendo la invariante, si una instancia modifica los datos de otra instancia ha de seguir manteniendo la invariante de la clase de esa otra instancia. Para mantener la invariante y la encapsulación generalmente se proporciona acceso a un método y no directamente a las propiedades.

La modularidad a partir Java 9

Los ámbitos de visbilidad es un mecanismo bastante limitado ni es suficiente para proporcionar encapsulación. No hay ningún impedimento a que cualquiera pueda crear una clase en un paquete que contiene clases privadas de paquete o métodos package private o heredar de esas clases y de esta menera tener acceso a clases, métodos y propiedades que el autor original no las diseñó para esos propósitos. Puede ser incluso un problema de seguridad.

La modularidad añadida en Java 9 viene a complementar y dar una solución más completa a los ámbitos de visibilidad así como garantizar mejor la encapsulación tal y como el programador del paquete original ha diseñado.

Comparte el artículo: