Hasta ahora, todos los campos y métodos que hemos declarado han pertenecido a instancias de clase. Los miembros estáticos también se pueden agregar a una clase. Un miembro estático se inicializa al inicio del programa y está disponible para todas las instancias de una clase.
Como ejemplo, podríamos querer llevar la cuenta del número de instancias de ‘Animal’ que tenemos. Estos datos no deben ser exclusivos de una instancia de ‘Animal’ u otra; debe ser igual para todos los animales. Cambiemos Animal.jspp para lograr esto usando el modificador ‘estático’:
external $; module Animals { class Animal { protected var $element; private static unsigned int count = 0; protected Animal(string iconClassName) { string elementHTML = makeElementHTML(iconClassName); $element = $(elementHTML); Animal.count++; } public static unsigned int getCount() { return Animal.count; } public virtual void render() { $("#content").append($element); } private string makeElementHTML(string iconClassName) { string result = '<div class="animal">'; result += '<i class="icofont ' + iconClassName + '"></i>'; result += "</div>"; return result; } } }
Hemos creado un nuevo campo en la clase ‘Animal’: ‘count’. Se inicializa a cero al inicio del programa porque está marcado como ‘estático’. A partir de ahí, en cada llamada de constructor de ‘Animal’ (por ejemplo, mediante herencia), incrementamos el campo estático ‘recuento’ en uno utilizando el operador de incremento ++. Nos referimos al campo estático a través de ‘Animal.count’. En realidad, no necesitamos calificar el nombre en este grado y solo podemos usar ‘contar’ dentro de la clase, pero mi intención era mostrar cómo se debe acceder a ‘contar’ a través del nombre de la clase en lugar de una instancia. Finalmente, declaramos un método getCount() que devuelve el valor del campo estático.
Vaya a main.jspp y presente este recuento en la página web usando jQuery:
import Animals; external $; Animal[] animals = [ new Cat("Kitty"), new Cat("Kat"), new Dog("Fido"), new Panda(), new Rhino() ]; foreach(Animal animal in animals) { animal.render(); } $("#content").append("<p>Number of animals: " + Animal.getCount().toString() + "</p>");
Compile el proyecto y abra index.html. Ahora debería ver el conteo después de sus animales renderizados:
Si bien hemos mostrado la inicialización de campos estáticos en la declaración, hay otra forma de inicializar nuestros campos estáticos: constructores estáticos. También podemos cambiar Animal.jspp para usar un constructor estático de la siguiente manera:
external $; module Animals { class Animal { protected var $element; private static unsigned int count; protected Animal(string iconClassName) { string elementHTML = makeElementHTML(iconClassName); $element = $(elementHTML); Animal.count++; } static Animal() { Animal.count = 0; } public static unsigned int getCount() { return Animal.count; } public virtual void render() { $("#content").append($element); } private string makeElementHTML(string iconClassName) { string result = '<div class="animal">'; result += '<i class="icofont ' + iconClassName + '"></i>'; result += "</div>"; return result; } } }
Los constructores estáticos no toman ningún parámetro y no pueden tener aplicados modificadores de acceso. Se ejecutarán al inicio de la aplicación. En el código anterior, el campo estático ‘recuento’ no se inicializó en la declaración. En cambio, movimos la inicialización del campo ‘recuento’ al constructor estático.
JS++ no tiene un «alcance global» como lo tiene JavaScript. En cambio, las variables que podrían haberse filtrado al alcance global en JavaScript estarían en el «ámbito del archivo» en JS++ y no estarán disponibles fuera del archivo que se declara. Si desea «variables globales», puede lograr un subconjunto más seguro conocido como «datos globales de la aplicación» usando miembros estáticos, y es igual de útil sin los problemas potenciales de las variables globales (por ejemplo, fugas no intencionales a otros programas o bibliotecas). Este es un ejemplo de cómo puede crear datos globales de la aplicación usando miembros estáticos:
module Application { class Config { public static string hostname = "127.0.0.1"; public static unsigned int port = 80; } }
Para obtener más información sobre el alcance, consulte la documentación de JS++ .