Java Package Visibility

Una de las preguntas más habituales en los exámenes de certificación es sobre Java package visibility , o dicho de otra forma, sobre la visibilidad que tienen nuestros métodos y variables para los diferentes packages. Para mucha gente en Java existen tres niveles de visibilidad.

Java Package Visibility (private vs public)

Estos dos ámbitos de visibilidad son los más conocidos , las variables publicas de una clase son accesibles desde cualquier otra clase , mientras las variables privadas son únicamente accesibles desde métodos de la misma clase.

Java Package Visibility (protected y default)

El ámbito de protected hace referencia a una variable o método que puede ser accedida desde la propia clase y desde las clases hijas.

Una pregunta muy habitual : ¿Es posible para una clase hija acceder a la variable protegida desde otro package?. La respuesta es SÍ. Acabamos de ver los tres ámbitos de visibilidad que se definen usando una palabra reservada. Ahora bien, existe un cuarto ámbito de visibilidad  que no usa ninguna palabra reservada. Este ámbito se denomina ámbito de paquete (package) o default access.

En este caso la variable o método no tiene ninguna palabra reservada que asigne su visibilidad. Será accesible desde todas las clases que se encuentren en el mismo package. Las clases que pertenezcan a otro package no podrán acceder. Es la diferencia fundamental entre package visibility y public visibility.

Encapsulación y Visibilidad

Prácticamente todo el mundo entiende los ámbitos de visibilidad una vez que les explicas cada uno de ellos . Lo que a veces es más difícil de entender es cuando usar cada uno de ellos sobre todo el de package o default access.  Vamos a construir un ejemplo que nos ayude.


package com.arquitecturajava.package1;

public class Servicio {

public String mensaje() {

return "hola";
}
}


package com.arquitecturajava.package1;

class ServicioUtilidad {

String mayusculas(String mensaje) {

return mensaje.toUpperCase();
}
}

Tenemos dos clases una tiene visibilidad pública que es lo más habitual , la segunda visibilidad de package. Es decir no lleva “public” en su declaración. ¿Por qué definir este clase así?. Porque suponemos que esta clase solo es útil para las clases que están dentro del package1 y fuera de él no tiene sentido que se vean. Estamos utilizando el concepto de encapsulación a nivel de packages.

Por lo tanto nuestro programa main solo mostrará la clase Servicio en el intellisense y no la de ServicioUtilidades ya que no podemos acceder a ella ,su visibilidad es de package.

Otros artículos relacionados:

Java this vs this() 

Java Generics