Ver Mensaje Individual
  #3 (permalink)  
Antiguo 06/10/2015, 05:24
Kritik
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 12 años, 1 mes
Puntos: 31
Respuesta: Clases no instanciables

A mí lo que me han enseñado es que una clase es un modelo para ser copiado. Y un simil que se me ocurre a la manera de habérmelo enseñado son las casas piloto.

Una casa piloto es la primera que se construye cuando se construye una urbanización. Es un modelo que luego va a ser copiado para hacer toda la urbanización de casas. Y que se construye para ver si los clientes quieren comprar una copia de esa casa o no.

Sin embargo... puede ser que nadie quiera comprar una copia. Y no se construyan copias. ¿Significa eso que el modelo no es habitable, y usable? No... ese modelo ya se puede utilizar, y entonces únicamente habrá 1 única copia de ese modelo. Pero no es ninguna copia, es simplemente el original. El modelo es el que se usa directamente.

¿Qué ha pasado entonces? En el momento en el que se decide que (debido a que nadie quiere copias) no se van a construir más casas... en ese momento se coloca sobre todos y cada uno de los atributos de la casa el modificador static. Y también sobre todos y cada uno de sus métodos.

Ahora que la casa piloto es estática... todo aquel que pase por delante puede utilizar su atributo booleano timbre y cambiar su estado de desactivado (false) a activado (true) y así llamar a la puerta. Quizá ese cambio active un disparador que genere más cosas... o quizá no. Quién sabe.

Resumiendo: La existencia de la propia clase ya es de por sí un objeto. Igual que la existencia de la clase Math ya es de por sí un objeto. Solo que al tener sobre la propia clase el parámetro static no se pueden crear más objetos iguales, no se puede tener ninguna copia.

Así es como yo le veo la lógica. Que si se tiene un modelo (clase) del cual no se quieren copias... se ponga el constructor (aquel método al que se llama cuando se quiere construir una copia) el modificador static.

Pero... ¿y si el método del constructor no admite el modificador static? Entonces la clase si se podría copiar, aunque esa copia no guardase ningún atributo y ningún método... pues todos serían estáticos.

Sería algo así como que te dicen "Este terreno es tu casa... pero no tienes los atributos de puertas, ni ventanas, ni paredes, ni techos, ni cimientos ni baldosas en el suelo... Ni si quiera tienes los métodos de habitar, ni calentarse, ni guarecerse de la climatología, ni encender la luz, ni limpiar..."

¿Para qué quiero yo entonces instanciar una clase que no tiene nada? Que me dejen poner a la casa piloto el modificador static. Y así nadie tendrá objetos sin atributos ni métodos porque esos atributos y métodos están en la clase original.

Así pues, según lo que me han enseñado a mí es que el modificador static no permite hacer una única instanciación si esta no existe como dices... sino que el propio atributo o método estático ya es algo utilizable simplemente por su existencia, simplemente por estar declarado. Y no hace falta hacer ninguna copia, porque se puede utilizar directamente el original simplemente por estar declarado y "existir". Como la clase Math que permite acceder a la constante Pi o a sus métodos. Simplemente porque el original ya existe.

Así es como me lo han enseñado a mí.

Pero como indico en mi anterior post de este hilo... el modificador static no se puede aplicar sobre el constructor ni sobre la declaración de la clase. Así pues... la única forma que se me ha ocurrido de conseguir una clase que no se puedan crear copias vacias es escondiendo el constructor (haciendo un único constructor sin parámetros y poniéndolo como private). Mi duda es si esto es correcto hacerlo así o se hace de alguna otra manera.

Si yo quiero conseguir una clase que funcione igual que la clase Math, con atributos estáticos y métodos estáticos. Que se puedan utilizar pero que no se pueda instanciar. ¿Se hace así?

Y luego otra pregunta aún más enrevesada: ¿Cómo consigo que los métodos de una clase que no se pueda instanciar... se ejecuten en hilos de ejecución distintos? (Toma ya menudo enrevesamiento!!)

Última edición por Kritik; 06/10/2015 a las 05:37