Ver Mensaje Individual
  #4 (permalink)  
Antiguo 06/10/2015, 06:04
Avatar de Profesor_Falken
Profesor_Falken
 
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Clases no instanciables

Buenas,

Kritik, solo he leido tu primer mensaje porque el segundo es mas largo y aun no tengo tiempo.

Cita:
Sin embargo... he intentado instanciar la clase Math y me ha dado un error. Lo primero que he pensado es que en la declaración de la clase llevaba el modificador static. Así pues a mi clase se lo he puesto... y me ha dado un error. Eclipse solo me daba una solución: Eliminar el modificador static. Entonces... ¿como Math no se puede instanciar? He ido al error que me daba al intentar instanciar... y eclipse me decía que no había ningún constructor visible.

Por otra parte, en otras clases sin declarar constructor, siempre funciona el constructor vacio (el que no recoge parámetros) aunque no esté declarado.
No hay misterio. Si miras las clase java.lang.Math, veras que su constructor es privado. Por eso no se puede instanciar directamente.
Para clases como Math, que no tienen estado, interesa que se comporten de forma estatica para evitar la creacion de instancias necesarias. Esto tambien permite que la clase sea thread-safe y facilita su uso.
(Otra aproximacion, que no se debe confundir y que es la utilizada por muchas clases del JDK, como la clase String, es la inmutabilidad. La clase es creada en el constructor pero su estado no puede ser modificado. Esto tambien le permite ser utilizada con seguridad en escenarios multihilo.)

Para la clase Empleado que comentas, no se puede aplicar la misma base que para Math, ya por definicion deberia haber muchas instancias de empleado con diversos estados.
La clase Empleado debe poder instanciarse normalmente (si lo haces bien deberias implementar algun Factory que se encargue de instanciarla cuando sea necesario).


@Malenko
static != singleton
Aunque ambas soluciones son thread-safe son son exactamente lo mismo.
Una clase creada siguiendo el patron singleton puede inicializarse de forma lazy mediante proxy pattern o puede implementar una interfaz, por ejemplo.

Un ejemplo de singleton en el JDK es la clase java.lang.Runtime.

Un saludo
__________________
If to err is human, then programmers are the most human of us