Modificadores en Java


  • Modificadores de acceso: PUBLIC, PRIVATE, PROTECTED, DEFAULT.

DEFAULT:
Si no elegimos ningún modificador, se usa el de por defecto, que sólo puede ser accedido por clases que están en el mismo paquete.

PUBLIC:
Este nivel de acceso permite a acceder al elemento desde cualquier clase, independientemente de que esta pertenezca o no al paquete en que se encuentra el elemento.

PRIVATE:
Es el modificador más restrictivo y especifica que los elementos que lo utilizan sólo pueden ser accedidos desde la misma clase en la que se encuentran. Este modificador sólo puede utilizarse sobre los miembros de una clase y sobre interfaces y clases internas, no sobre clases o interfaces de primer nivel, dado que esto no tendría sentido.

PROTECTED:
Indica que los elementos sólo pueden ser accedidos desde su mismo paquete y desde cualquier clase que extienda la clase en que se encuentra, independientemente de si esta se encuentra en el mismo paquete o no. Este modificador, como private, no tiene sentido a nivel de clases o interfaces no internas.

En otras palabras, si determinada clase Hijo hereda el comportamiento de una clase Padre, la clase Hijo tendrá acceso a todos aquellos campos/métodos definidos como protected en Padre, pero no aquellos declarados como private en Padre.

Modificadores de acceso

Modificadores de acceso

  • Modificadores de clases y métodos: STATIC, FINAL, ABSTRACT.

STATIC:
Sirve para crear miembros que pertenecen a la clase, y no a una instancia de la clase. Esto implica, entre otras cosas, que no es necesario crear un objeto de la clase para poder acceder a estos atributos y métodos.

En ocasiones es necesario o conveniente generar elementos que tomen un mismo valor para cualquier número de instancias generadas o bien invocar/llamar métodos sin la necesidad de generar instancias, y es bajo estas dos circunstancias que es empleado el calificador static.

Dos aspectos característicos de utilizar el calificador static en un elemento Java son los siguientes:

No puede ser generada ninguna instancia (uso de new) de un elemento static puesto que solo existe una instancia.

– Todos los elementos definidos dentro de una estructura static deben ser static ellos mismos, o bien, poseer una instancia ya definida para poder ser invocados.

NOTA: Lo anterior no implica que no puedan ser generadas instancias dentro de un elemento static; no es lo mismo llamar/invocar que crear/generar.

FINAL:
Indica que una variable, método o clase no se va a modificar, lo cuál puede ser útil para añadir más semántica, por cuestiones de rendimiento, y para detectar errores.

– Si una variable se marca como final, no se podrá asignar un nuevo valor a la variable.
– Si una clase se marca como final, no se podrá extender la clase.
– Si es un método el que se declara como final, no se podrá sobreescribir.

Algo muy a tener en cuenta a la hora de utilizar este modificador es que si es un objeto lo que hemos marcado como final, esto no nos impedirá modificar el objeto en sí, sino tan sólo usar el operador de asignación para cambiar la referencia. Por lo tanto:

NOTA: Una variable con modificadores static y final sería lo más cercano en Java a las constantes de otros lenguajes de programación.

ABSTRACT:
La palabra clave abstract indica que no se provee una implementación para un cierto método, sino que la implementación vendrá dada por las clases que extiendan la clase actual. Una clase que tenga uno o más métodos abstract debe declararse como abstract a su vez.

  • Mecanismos de sincronización: VOLATILE y SYNCRHONIZED.

VOLATILE:
volatile es más simple y más sencillo que synchronized, lo que implica también un mejor rendimiento. Sin embargo, volatile, a diferencia de synchronized, no proporciona atomicidad (que o se ejecuten todos los pasos o ninguno), lo que puede hacer que sea más complicado de utilizar.

Una operación como el incremento, por ejemplo, no es atómica. El operador de incremento se divide en realidad en 3 instrucciones distintas (primero se lee la variable, después se incrementa, y por último se actualiza el valor) por lo que algo como lo siguiente podría causarnos problemas a pesar de que la variable sea volatile:

SYNCRHONIZED:
En caso de que necesitemos atomicidad podemos recurrir a synchronized o a cosas más avanzadas, como las clases del API java.util.concurrent de Java 5.

synchronized se diferencia de volatile entre otras cosas en que este modificador se utiliza sobre bloques de código y métodos, y no sobre variables. Al utilizar synchronized sobre un bloque se añade entre paréntesis una referencia a un objeto que utilizaremos a modo de lock.