Si bien no hay mucho que decir acerca de las variables “static”, muchas veces nos llena de problemas si no las usamos correctamente. Este post breve tiene la intención de aclarar algunos puntos con respecto a sus usos.

Cada vez que queremos acceder a algún dato desde alguna parte X de nuestro programa, comúnmente en lugar de buscar y obtener la referencia suele ser más fácil hacer la variable que lo guarda “static” para accederlo desde cualquier lado de manera sencilla. El problema es que el funcionamiento de dichas variables no siempre soluciona más problemas de los que causa. Empecemos desde abajo.

¿QUÉ ES UNA VARIABLE “STATIC”?

Comúnmente vemos que todas las variables que nosotros creamos existen en cada una de las copias o instancias que nosotros creamos de nuestro script o clase. Por ejemplo, si creamos la variable “energy” dentro de nuestro script “Character”, cada uno de los “Character”s que hagamos tendrán CADA UNO su propia variable “energy”. Si en algún momento destruimos nuestra instancia, todas sus variables también serán destruidas… A menos qué… Sean “static”.

Una variable “static” es aquella que su tiempo de vida dura todo el programa y se crea EN EL SCRIPT y no EN LAS INSTANCIAS.

Para comprender esto de una mejor manera, hay que tener en cuenta la diferencia entre una clase y una instancia.

 

CLASE

Una clase es el tipo de dato que estás creando. Ya sea que se llame “Hero”, “Tank”, “LoQueSea”. Es como los tipos de datos que ya existen como “Math” (o “Mathf” dependiendo de la plataforma), “string”, “List”, etc. Es el archivo que creas y en el cual pones cada una de las variables y funciones que querés que posea. En algunas plataformas se le puede decir “script”, pero sea como sea que se lo llame es lo mismo (de hecho los scripts son clases ;) ).

 

INSTANCIA

Una instancia es la copia de esa clase, que se crea al momento de ser utilizada. Ya sea con el operador “new” (ej: new Character()), o con el modelo que requiera cada plataforma (por ejemplo, en Unity3D es GameObject.Instantiate() para algunas cosas). 

VOLVIENDO A LAS STATIC

Volviendo entonces a las variables estáticas, la diferencia principal está en dónde se aloja. Al crearse, la misma se queda DENTRO DE LA CLASE, y no en las INSTANCIAS. Lo que significa que cada una de las instancias o copias, como prefieran llamarlas, posee una copia de todas las variables creadas en la clase con excepción de las “static”.

Este tipo de variables se queda en la clase y se accede a través de dicha clase. Cada una de las instancias puede verla, lo cual no significa que esté ahí. Si una instancia la edita, el resto de las instancias también va a ver ese cambio.

 

 

 

En la imagen de arriba podemos ver que la variable estática “count” existe en la clase, pero igualmente cada una de las instancias la puede ver.

Si la quisiéramos acceder desde cualquier otro lugar, que no sean las instancias de la clase, tendríamos que escribir el nombre de dicha clase y luego el nombre de la variable. En el caso de la imagen, sería “CircleWithCount.count”.

Las variables estáticas nos dan el beneficio de poder accederlas desde cualquier lado sin dar vueltas. El problema es que al existir en la misma clase, no se borrán hasta que se cierra la aplicación, lo que significa que debemos tener cuidado con lo que guardamos ahí. Si no las usamos correctamente, podrían quedar datos cargados en ellas, los cuales no se van a eliminar de la memoria hasta no poner el valor de esa variable en “null” (en el caso de que la variable guarde un objeto). Esto puede traer errores al momento de cargar partes nuevas de nuestra aplicación. En el caso de un videojuego, podría traer problemas al cargar el siguiente nivel, ya que los datos dentro de las variables “static” no se reiniciarían ni nada, sino que quedarían igual.

Así que tengan mucho cuidado al llenar sus proyectos de variables estáticas sin ningún tipo de control. Sepan que cada vez que van a usar una, debería ser planeada su destrucción y más al momento de cargar o recargar ciertas partes de nuestras aplicaciones, sean juegos o sistemas.

Como siempre, espero que esta información les haya servido. Cualquier duda o consultas pueden ponerla en los comentarios.