Ir al contenido principal

Control de acceso en JAVA (Access control)

Así que insistes en aprender JAVA..... ni modo, ahora hablaremos del control de acceso en java que es el paso a seguir una vez entendida la herencia (si no entiendes herencia al 100% da click aqui).

El control de acceso se realiza atravez de los modificadores de acceso que son una serie de palabras reservadas que le indican al compilador lo que es visible o se puede utilizar fuera de la clase y lo que no.

Los modificadores de acceso son estos 4

public
protected
dafault (no especificado, no se escribe o "tu no tocar teclado cometer error" para las mentes menos      avanzadas )
private


Todas las variables de clase (variables definidas fuera de un método) , todos los constructores, todas las funciones, las declaraciones de clases,  de interfaces y de enumeraciones tienen un modificador de acceso así no se les escriba uno. es decir;

public int unNumero;  //tiene acceso publico

private int unNumero;//tiene acceso privado

protected int unNumero;//tiene acceso protegido

int unNumero; //tiene acceso por defecto es decir que si tiene un nivel de acceso así no se le haya especificado uno 

Algo que recordar sobre los niveles de acceso es que se ordenan de menos a mas restrictivos en este orden.
public, protected, default y private

Ahora que significa cada una de estas palabrejas... lo veremos después del siguiente corte comercial...
ya estamos de regreso.

public: quiere decir para todo el mundo, una variable, un metodo, una clase, una interfas, una enumeracion marcadas como public se podran acceder con total libertad desde cualquier otra clase.

public class Personaje{
public int numero;

public void metodo(){}

}

Esta clase es visible para todas las demás clases en otros paquetes (aprendete de memoria esto de un el mismo paquete y en otros paquetes) y todas sus variables publicas y métodos públicos se pueden acceder utilizando una instancia de la clase en cualquier otra clase en otro paquete (te lo advertí otra vez el cuentico ese  del otro paquete).

Lo que permite que las siguientes acciones sean legales en cualquier otra clase que se encuentre en otro paquete (otra vez, creo que aquí hay un patrón de comportamiento repetitivo y enfermizo)

Personaje p= new Personaje();
p.numero=3456;
int numeroLocal=p.numero;
p.metodo();

Como puedes ver que viva la libertad con el modificador public, pero no todo puede ser libertinaje y majadería, a toda clase le llega el momento de crecer, alinearse  y comportarse como una dama, el primer grado de recato y decencia le llega con el modificador por defecto default, el modificador default no existe como palabra reservada (si existe pero no se debe escribir ni como modificador ni como variable ni como método ni como nada. nació para no ser visto y esa esa una vida mucho muy triste).

Para declara cualquier cosa como default lo que hay que hacer es absolutamente nada...

package com.paquete1;

class Personaje{
int numero;

void metodo(){}

}
La restricción default permite que solo las clases en el mismo paquete puedan acceder a miembros o clases declaradas como default es decir que la clase  Personaje declarada en el paquete com.paquete1
solo se puede instanciar en  clases que se encuentren en el mismo paquete

package com.paquete1;

class Terreno{

public Terreno(){

Personaje p= new Personaje();
p.numero=3456;
int numeroLocal=p.numero;
p.metodo();

}

}

Y ahora ¿que pasa si estoy en otro paquete o en un subpaquete del mismo?... simple te requete llenas de errores. LO SIGUIENTE NO FUNCIONA:


package com; //en la raiz del paquete

public class TerrenoEnLaRaiz{

public TerrenoEnLaRaiz(){

Personaje p= new Personaje();//NOOOOOOOOOOOOOOOOOOOO
p.numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=p.numero;//NOOOOOOOOOOOOOOOOOOOO
p.metodo();//NOOOOOOOOOOOOOOOOOOOO

}

}


package com.paquete1.subPaquete; //en un subPaquete

public class TerrenoEnSub{

public TerrenoEnSub(){

Personaje p= new Personaje();//NOOOOOOOOOOOOOOOOOOOO
p.numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=p.numero;//NOOOOOOOOOOOOOOOOOOOO
p.metodo();//NOOOOOOOOOOOOOOOOOOOO

}

}



package org.otroDiferente; //en un paquete completamente diferente

public class TerrenoEnDiferente{

public TerrenoEnDiferente(){

Personaje p= new Personaje();//NOOOOOOOOOOOOOOOOOOOO
p.numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=p.numero;//NOOOOOOOOOOOOOOOOOOOO
p.metodo();//NOOOOOOOOOOOOOOOOOOOO

}

}

Conociendo los dos primeros modificadores de acceso podemos lanzar la primera regla relacionada con ellos.

la primera regla relacionada con public y default es esta; la clase definida en un archivo ".java" con el mismo nombre del archivo debe ser declarada public o default es decir
en el archivo
 Personaje.java
debe existir una de las siguientes declaraciones
public class personaje{}
o
class personaje{}

la clase declarada de esta forma sera la clase principal del archivo y la única que ejecutara el método main() cuando se lance con el comando

java Personaje.java 

Al leer esto dirás ¿la única?, ¿es que hay mas clases en un mismo archivo ?, ¿pero que es esto?... ¡exijo que me regresen mi dinero! ante todo no se aceptan devoluciones porque esto es gratis como le gusta a mi pueblo y en el lugar del todo porque ya escribí el ante, pues si una clase en java se puede definir como subclase, inerclase, clase anónima y otras dos formas pero eso ya lo veras mas adelante y no es complejo cuando ya se ha trabajado con el lenguaje un tiempo.


El siguiente modificador es protected, este modificador es una versión de default que permite acceder a los miembros de una clase utilizando la herencia (si de herencia no tienes ni idea has click aqui). este modificador si debe ser especificado y por ahora diremos que solo se aplica a constructores, variables y métodos.

package com.paquete1;

public class Personaje{//en este ejemplo Personaje es public para poder heredar la clase por fuera del //paquete

protected int numero;

protected void metodo(){}

}
package com.paquete1; //mismo paquete

public class Terreno{

public Terreno(){

Personaje p= new Personaje();
p.numero=3456;
int numeroLocal=p.numero;
p.metodo();

}
package com; //en la raiz del paquete

public class TerrenoEnLaRaiz{

public TerrenoEnLaRaiz(){

Personaje p= new Personaje();//NOOOOOOOOOOOOOOOOOOOO
p.numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=p.numero;//NOOOOOOOOOOOOOOOOOOOO
p.metodo();//NOOOOOOOOOOOOOOOOOOOO

}

}


package com.paquete1.subPaquete; //en un subPaquete

public class TerrenoEnSub{

public TerrenoEnSub(){

Personaje p= new Personaje();//NOOOOOOOOOOOOOOOOOOOO
p.numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=p.numero;//NOOOOOOOOOOOOOOOOOOOO
p.metodo();//NOOOOOOOOOOOOOOOOOOOO

}

}
package org.otroDiferente; //en un paquete completamente diferente

public class TerrenoEnDiferente{

public TerrenoEnDiferente(){

Personaje p= new Personaje();//NOOOOOOOOOOOOOOOOOOOO
p.numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=p.numero;//NOOOOOOOOOOOOOOOOOOOO
p.metodo();//NOOOOOOOOOOOOOOOOOOOO

}

}

hasta el momento igual que default mismos problemas mismas restricciones pero esto lo arreglamos con herencia

package com; //en la raiz del paquete

public class TerrenoEnLaRaiz extends Personaje{

public TerrenoEnLaRaiz(){


numero=3456;
int numeroLocal=numero;
metodo();

}

}


package com.paquete1.subPaquete; //en un subPaquete

public class TerrenoEnSub extends Personaje{

public TerrenoEnSub(){

numero=3456;
int numeroLocal=numero;
metodo();
 }

}

package org.otroDiferente; //en un paquete completamente diferente

public class TerrenoEnDiferente extends Personaje{

public TerrenoEnDiferente(){

numero=3456;
int numeroLocal=numero;
metodo();
 }

}

si notas algo diferente es que decir
 
Personaje p= new Personaje();
p.numero=3456;

En una clase fuera del paquete sigue siendo ilegal (la parte de p.numero=3456; no el new Personaje(); porque personaje ahora es publico) . lo que cambia ahora es que al haber heredado nuestras clases tiene un personaje interior del cual pueden llamar los métodos protected, leer y reasignar las variables protected.
 
El ultimo por hoy sera private el modificador de los envidiosos, los egoístas y los que no sueltan el balón en un partido de futbol. Por el momento diremos que el mezquino modificador private aplica para variables, constructores y metodos. Y que hace muy simple no deja que nadie fuera de la clase pueda ver o tocar lo que se ha marcado como private así que nada de lo siguiente es legal

package com.paquete1;

public class Personaje{//en este ejemplo Personaje es public para poder heredar la clase por fuera del //paquete

private int numero;

private void metodo(){}

}
package com.paquete1; //mismo paquete

public class Terreno{

public Terreno(){

Personaje p= new Personaje();//NOOOOOOOOOOOOOOOOOOOO
p.numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=p.numero;//NOOOOOOOOOOOOOOOOOOOO
p.metodo();//NOOOOOOOOOOOOOOOOOOOO

}
package com; //en la raiz del paquete

public class TerrenoEnLaRaiz{

public TerrenoEnLaRaiz(){

Personaje p= new Personaje();//NOOOOOOOOOOOOOOOOOOOO
p.numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=p.numero;//NOOOOOOOOOOOOOOOOOOOO
p.metodo();//NOOOOOOOOOOOOOOOOOOOO

}

}


package com.paquete1.subPaquete; //en un subPaquete

public class TerrenoEnSub{

public TerrenoEnSub(){

Personaje p= new Personaje();//NOOOOOOOOOOOOOOOOOOOO
p.numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=p.numero;//NOOOOOOOOOOOOOOOOOOOO
p.metodo();//NOOOOOOOOOOOOOOOOOOOO

}

}
package org.otroDiferente; //en un paquete completamente diferente

public class TerrenoEnDiferente{

public TerrenoEnDiferente(){

Personaje p= new Personaje();//NOOOOOOOOOOOOOOOOOOOO
p.numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=p.numero;//NOOOOOOOOOOOOOOOOOOOO
p.metodo();//NOOOOOOOOOOOOOOOOOOOO

}

}
 ni siquiera el heredar

package com; //en la raiz del paquete

public class TerrenoEnLaRaiz extends Personaje{

public TerrenoEnLaRaiz(){

numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=numero;//NOOOOOOOOOOOOOOOOOOOO
metodo();//NOOOOOOOOOOOOOOOOOOOO

}

}


package com.paquete1.subPaquete; //en un subPaquete

public class TerrenoEnSub extends Personaje{

public TerrenoEnSub(){

numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=numero;//NOOOOOOOOOOOOOOOOOOOO
metodo();//NOOOOOOOOOOOOOOOOOOOO
 }

}

package org.otroDiferente; //en un paquete completamente diferente

public class TerrenoEnDiferente extends Personaje{

public TerrenoEnDiferente(){

numero=3456;//NOOOOOOOOOOOOOOOOOOOO
int numeroLocal=numero;//NOOOOOOOOOOOOOOOOOOOO
metodo();//NOOOOOOOOOOOOOOOOOOOO
 }

}


como puedes ver esto es lo mas básico de los modificadores. ¿ahora que sigue? simple

Aprender a mesclar modificadores (da click aquí).

y algo que todo el mundo debe entender y es que los modificadores son de clase no de instancia (da click aqui). 

Comentarios

Entradas populares de este blog

Conectarse al LDAP (directorio activo) utilizando JAVA

Un LDAP es un sistema de autenticación estándar utilizado por muchas compañías para controlar el acceso a aplicaciones y recursos. Por lo general se espera que cualquier nueva aplicación haga uso del LDAP para realizar la autenticación y controlar los permisos en forma unificada, la seguridad es transversal a todos los procesos que realiza una organización. Una vez regado el cuento a lo que vinimos, como conectarse a un LDAP. Lo primero que debes saber es que no se requieren librerías adicionales, JAVA en su distribución estandar ya cuenta con todo lo que necesitas. primero tres siglas que tienes que tener en cuanta. CN  = Common Name OU  = Organizational Unit DC  = Domain Component Para conectarse primero necesitas es instanciar un Objeto de la clase LdapContext, este se encargara de manejar la conexión al LDAP y las peticiones que se hagan al mismo. por consiguiente necesitara que le entregues una serie de propiedades de conexión. Esto lo haras con un Map de...

Clases anónimas JAVA (Anonymous Classes)

Código fuente articulo: https://www.dropbox.com/s/pzw44ot0ji2metl/Lambda.zip?dl=0 Las Clases anónimas en JAVA son una solución rápida para implementar una clase que se va utilizar una vez y de forma inmediata. Por ejemplo el  EventHandler  para un botón se puede implementar en la misma asignación valiendonos de la interfaz  EventHandler  que ya esta definida. Pero mejor vamos con un ejemplo mas simple. De la definición anterior concluimos dos cosas la primera es que para crear una clase anónima es necesario haber definido una interfaz, una clase o una clase abstracta. La clase anónima lo que hará sera implementar la interfaz definida o sobre escribir los métodos definidos. Para ilustrar esto utilizaremos el ejemplo del JAVA Tutorial https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html . en este ejemplo tenemos que implementar clases que cumpliendo con la interfaz Saludo sean capaces de saludar en diferentes idiomas. El paso uno ...

Paralelismo en JAVA Executors (ExecutorService, Callables y Futures).

Código fuente articulo: https://www.dropbox.com/s/jci67120hmd0uce/Paralelismo.zip?dl=0 Para manejo de concurrencia Java desde la versión 5 presento el Concurrency API  este presento una mejora substancial en el manejo de hilos y procesos en paralelo, antes solo contabas con Thread y Runnable. lo que te obligaba a controlar la creación y el numero de hilos de ejecución, no te entregaba un resultado del procesamiento y no te dejaba controlar las Excepciones que lanzara un hilo...un hilo se lanzaba y amenos que le enviaras un un CallBack perdías todo contacto con el. Para solucionar este problema se crearon dos tipos de objetos Callables y Futures. estos dos te permiten encapsular una tarea asignándole un tipo de Objeto que sera el valor de retorno y hacer seguimiento a las tareas que ejecuto en paralelo pudiendo preguntar si ya termino, que resultado lanzo y que excepciones ocurrieron. Arranquemos con la implementación de Callable, Callable es una interfaz que te permite de...