02 enero, 2011

Modificadores de Acceso

Modificadores de Acceso en Java
Los modificadores son elementos del lenguaje que se colocan delante de la definición de variables locales, datos miembro, métodos o clases y que alteran o condicionan el significado del elemento. En entradas anteriores se ha descrito uno, el modificador static que se usa para definir datos miembros o métodos como pertenecientes a una clase, en lugar de pertenecer a una instancia. En entradas futuras se describirán otros modificadores como final, abstract o synchronized. En este capítulo se presentan los modificadores de acceso, que son aquellos que permiten limitar o generalizar el acceso a los componentes de una clase o a la clase en si misma.

Los modificadores de acceso permiten al diseñador de una clase determinar quien accede a los datos y métodos miembros de una clase, estos preceden preceden a la declaración de un elemento de la clase (ya sea dato o método), de la siguiente forma:


[modificadores] tipo_variable nombre; <--> public int numero;

Existen los siguientes modificadores de acceso:

public - Todo el mundo puede acceder al elemento. Si es un dato miembro, todo el mundo puede ver el elemento, es decir, usarlo y asignarlo. Si es un método todo el mundo puede invocarlo.

private - Sólo se puede acceder al elemento desde métodos de la clase, o sólo puede invocarse el método desde otro método de la clase.

protected - Se explicará en el capítulo dedicado a la herencia.

Sin modificador - Se puede acceder al elemento desde cualquier clase del package donde se define la clase.

Pueden utilizarse estos modificadores para cualquier tipo de miembros de la clase, incluidos los constructores (con lo que se puede limitar quien puede crear instancias de la clase).

En el ejemplo los datos miembros de la clase Punto se declaran como private, y se incluyen métodos que devuelven las coordenadas del punto. De esta forma el diseñador de la clase controla el contenido de los datos que representan la clase e independiza la implementación de la interface.

class Punto 
{
private int x , y ;
static private int numPuntos = 0;

Punto ( int a , int b ) 
{
x = a ; y = b;
numPuntos ++ ;
}

int getX() 
{
return x;
}

int getY() 
{
return y;
}

static int cuantosPuntos() 
{
return numPuntos;
}
}

Si alguien, desde una clase externa a Punto, intenta:

Punto p = new Punto(0,0);
p.x = 5;

Lo que obtendrá será un error del compilador.

Usando Modificadores de Acceso en Clases:
public - Todo el mundo puede usar la clase. Se pueden crear instancias de esa clase, siempre y cuando alguno de sus constructores sea accesible.
sin modificador - La clase puede ser usada e instanciada por clases dentro del package donde se define.
Las clases no pueden declararse ni protected , ni private .

¿Por qué son importantes los modificadores de acceso?
Porque estos permiten al diseñador de clases delimitar la frontera entre lo que es accesible para los usuarios de la clase, lo que es estrictamente privado y 'no importa' a nadie más que al diseñador de la clase e incluso lo que podría llegar a importar a otros diseñadores de clases que quisieran alterar, completar o especializar el comportamiento de la clase.
Con el uso de estos modificadores se consigue uno de los principios básicos de la Programación Orientada a Objetos, que es la encapsulación: Las clases tienen un comportamiento definido para quienes las usan conformado por los elementos que tienen un acceso público, y una implementación oculta formada por los elementos privados, de la que no tienen que preocuparse los usuarios de la clase.

Los otros dos modificadores, protected y el acceso por defecto (package) complementan a los otros dos. El primero es muy importante cuando se utilizan relaciones de herencia entre las clases y el segundo establece relaciones de 'confianza' entre clases afines dentro del mismo package. Así, la pertenencia de las clases a un mismo package es algo más que una clasificación de clases por cuestiones de orden.

Cuando se diseñan clases, es importante pararse a pensar en términos de quien debe tener acceso a que. Qué cosas son parte de la implantación y deberían ocultarse (y en que grado) y que cosas forman parte de la interface y deberían ser públicas.

No hay comentarios.:

Publicar un comentario