El modificador estático en Java: métodos. Métodos estáticos

La estática es un estado global. Método estático o variable estática absolutamente no diferente de una variable global, porque ni la variable estática ni la global se pasaron como argumentos en ningún lugar y de ninguna manera, lo que significa que provienen del espacio global.

¿Cómo puede ser peligrosa la estática?
Imagina que estás escribiendo una utilidad para descargar imágenes. Y ahora ha llegado el momento en que necesita especificar parámetros de recorte para las vistas previas. Estáticamente podría verse así:

Carga de función pública() ( $ancho = Config::read("ancho"); $alto = Config::read("alto"); // .. Sube.. )
(Nota: CakePHP está lleno de este tipo de enfoques)
¿Problemas con este enfoque?

1. Necesita saber y estar absolutamente seguro de que la clase estática Config se inicializó en algún lugar lejano. ¿Qué pasa si no se inicializó?

2. ¿Qué pasa si decides cambiar la fuente de configuración? Por ejemplo, lea, ¿esto no es todo de la clase `Config`, sino de algún lugar de REST? Tendremos que reescribir todo y luego probarlo nuevamente. Este problema se conoce como ligamento fuerte.

3. Intente escribir una prueba unitaria para esto, sin trucos ni muletas usadas en exceso. Después de todo, para probar este método, necesitamos inicializar `Config` en algún lugar del espacio global y luego asegurarnos de que funcione.

4. Dependencias ocultas.

Por ejemplo, al inicializar una clase, en el caso de estática:

$cargador = nuevo cargador(); $cargador->cargar(...);

Usted y sus usuarios no ven qué dependencias tiene la clase y de qué depende generalmente. El problema es especialmente notable cuando escribes una biblioteca o componente.

Pero entonces, ¿por qué frameworks tan populares como Yii o Laravel están completamente cubiertos de estática?

Para comprender las consecuencias de la estática, intente utilizar al menos un componente del marco Yii por separado. Por ejemplo, si solo necesitas un CAPTCHA, no podrás sacarlo de allí sin reescribir casi todo el componente, porque en todas partes hay un estado global, en la forma `Yii::$app-> `. Es decir, para usar solo captcha, tendrás que conectar todo el framework y todos sus mecanismos internos cuando esto no sea absolutamente necesario.

En cuanto a Laravel, hay menos estática, ya que algunos componentes, como Eloquent, se pueden usar por separado. La estática está en Lara, existe como un contenedor, pero no como una implementación, en muchos lugares, a diferencia de Yii.

En general, mira cómo se resuelven los problemas en Zend/Symfony.
Allá casi en todas partes todas las dependencias se pasan como argumentos, lo cual es bueno, está poco acoplado y se puede probar.

Número variable de parámetros del método.

A veces, la cantidad de argumentos que se pasarán a un método no se conoce hasta el tiempo de ejecución. Por ejemplo, necesita una clase que dibuje una línea en una gráfica, dada una secuencia de coordenadas xey. Esta clase debe contener un método que tome un único argumento: un objeto de tipo Punto, representando los valores de las coordenadas x e y. Este método debe guardar todos los objetos de tipo. Punto en una lista vinculada o en elementos de matriz hasta que el programa que llama ordena que se imprima la secuencia completa de puntos. Sin embargo, esta solución puede no ser muy eficaz porque requiere una lista vinculada en la clase. Pero sólo hay un método que podría utilizarse: dibujarlínea¿Quién puede no necesitar esta lista? . Este problema se resuelve eficazmente mediante el método de argumento variable.

A este método se le puede dar un número variable de argumentos mediante la palabra clave parámetros en forma de matriz. Veamos una clase de ejemplo. Cuadro, escrito en C#, permitiendo al usuario obtener y mostrar una cantidad arbitraria de objetos con una sola llamada Punto:

usando Sistema;

clase Punto // Clase de punto

Punto público (int x, int y) ( this.x = x; this.y = y; )

público int x; público int y;

clase Gráfico //Clase de cajón

public void DrawLine (Gráficos g, parámetros Punto p)

Console.WriteLine("\nEste método le permite dibujar una línea " +

"en los siguientes puntos:");

para (int i = 0; i< p.GetLength(0); i++)

( Console.WriteLine("(0), (1)". p[i].x, p[i].y); )

clase ChartApp

vacío estático público principal ()

Punto p1 = nuevo Punto(5,10);

Punto p2 = nuevo Punto(5, 15);

Punto p3 = nuevo Punto(5, 20);

Gráfico gráfico = nuevo gráfico();

gráfico.DrawLine(p1, p2, p3);

Método dibujarlínea le dice al compilador de C# que puede aceptar un número variable de objetos de tipo Punto. Luego, en tiempo de ejecución, el método utiliza un bucle simple. para para pasar por todos los objetos Punto y mostrando todos los puntos.

Un método estático es un método que existe en la clase como tal, y no en instancias individuales de la misma. Al igual que con otros miembros estáticos, la principal ventaja de los métodos estáticos es que residen fuera de instancias de clase específicas, sin contaminar el espacio global de la aplicación. Al mismo tiempo, no violan los principios de la programación orientada a objetos, ya que están asociados con una clase específica.

La palabra clave le permite definir un método como estático estático. Luego, el usuario usa una sintaxis como Clase. Método. Esta sintaxis es necesaria incluso si el usuario tiene una referencia a una instancia de la clase.


Estático ( estático) se pueden llamar métodos, o métodos de clase, sin crear una instancia del objeto. Así es como se utiliza el método. Principal.

muestra de clase pública

público estático int a;

público int b;

público estático vacío DoubleA() ( a *= 2; )

conjunto vacío públicoB() ( b = a; )

Aplicación de clase pública

vacío estático público principal ()

Muestra sc1 = nueva Muestra(), sc2 = nueva Muestra();

Muestra.a = 1;

sc1.SetB();

Muestra.a = 2;

sc2.SetB();

Console.WriteLine("sc1.b = (0), sc2.b = (1)", sc1.b, sc2.b);

El último punto sobre los métodos estáticos es la regla que determina a qué miembros de la clase se puede acceder desde un método estático. Como puede imaginar, un método estático puede acceder a cualquier miembro estático dentro de la clase, pero no puede acceder a un miembro de la instancia.

Luego podemos acceder a ellos directamente a través del operador de resolución de alcance y nombre de clase. Pero ¿qué pasa si las variables miembro estáticas son privadas? Considere el siguiente código:

En este caso, no podemos acceder directamente a Anything::s_value desde main() ya que este miembro es privado. Normalmente, se accede a los miembros privados de una clase a través de métodos públicos. Si bien podríamos crear un método normal para acceder a s_value, ¡tendríamos que crear un objeto de esa clase para usar el método! Hay una mejor opción: podemos hacer que el método sea estático.

Al igual que las variables miembro estáticas, los métodos estáticos no están vinculados a ningún objeto de clase. Aquí está el ejemplo anterior, pero con un método estático:

clase Cualquier cosa (privado: static int s_value; público: static int getValue() (return s_value;) // método estático); int Cualquier cosa::s_value = 3; // definición de una variable miembro estática de la clase int main() ( std::cout<< Anything::getValue() << "\n"; }

Dado que los métodos estáticos no están vinculados a un objeto específico, se pueden llamar directamente a través del operador de resolución de alcance y nombre de clase, y también se pueden llamar a través de objetos de clase (pero esto no se recomienda).

Los métodos estáticos no tienen un puntero this *

Los métodos estáticos tienen dos características interesantes. Primero, dado que los métodos estáticos no están vinculados a un objeto, ¡no tienen! Esto tiene sentido, ya que este puntero siempre apunta al objeto sobre el que opera el método. Es posible que los métodos estáticos no funcionen a través de un objeto, por lo que este puntero no es necesario.

En segundo lugar, los métodos estáticos pueden acceder directamente a otros miembros estáticos (variables o funciones), pero no pueden acceder a miembros no estáticos. Esto se debe a que los miembros no estáticos pertenecen al objeto de clase, ¡pero los métodos estáticos no!

Otro ejemplo

Los métodos estáticos se pueden definir fuera del cuerpo de la clase. Esto funciona igual que con los métodos habituales. Por ejemplo:

class IDGenerator (privado: static int s_nextID; // declaración de una variable miembro estática public: static int getNextID(); // declaración de un método estático); // La definición de una variable miembro estática está fuera del cuerpo de la clase. Tenga en cuenta que aquí no utilizamos la palabra clave estática // Comience a generar ID en 1 int IDGenerator::s_nextID = 1; // La definición de un método estático está fuera del cuerpo de la clase. Tenga en cuenta que aquí no estamos usando la palabra clave estática int IDGenerator::getNextID() ( return s_nextID++; ) int main() ( for (int count=0; count< 4; ++count) std::cout << "The next ID is: " << IDGenerator::getNextID() << "\n"; return 0; }

clase IDGenerador

privado :

estático int s_nextID; // declaración de una variable miembro estática

público:

estático int getNextID(); // declaración de un método estático

//Comenzar a generar ID desde 1

int IDGenerador::s_nextID = 1;

int IDGenerator::getNextID() (devuelve s_nextID++;)

int principal()

para (int conteo = 0; conteo< 4 ; ++ count )

std::cout<< "The next ID is: " << IDGenerator :: getNextID () << "\n" ;

devolver 0;

Resultado:

El siguiente ID es: 1
El siguiente ID es: 2
El siguiente ID es: 3
El siguiente ID es: 4

Tenga en cuenta que dado que todas las variables y funciones de esta clase son estáticas, ¡no necesitamos crear un objeto de esta clase para trabajar con él! Se utiliza una variable miembro estática para almacenar el valor del siguiente identificador que se le asignará, y se utiliza un método estático para devolver el identificador e incrementarlo.

Una advertencia sobre clases con todos los miembros estáticos

Tenga cuidado al escribir clases con todos los miembros estáticos. Si bien estas "clases puramente estáticas" pueden resultar útiles, también tienen sus inconvenientes.

En primer lugar, dado que todos los miembros estáticos se crean solo una vez, no puede haber múltiples copias de una "clase puramente estática" (sin clonar la clase y luego cambiarle el nombre). Por ejemplo, si necesitamos dos objetos IDGenerator independientes, esto no será posible a través de una clase "puramente estática".

En segundo lugar, sabemos por la lección o que las variables globales son peligrosas porque cualquier fragmento de código puede cambiar sus valores y terminará cambiando otras piezas de código aparentemente no relacionadas (más detalles). Lo mismo ocurre con las clases "puramente estáticas". Dado que todos los miembros pertenecen a la clase (y no a sus objetos), y las clases tienen alcance global, entonces en una "clase puramente estática" declaramos funciones y variables globales con todas las desventajas que tienen.

C++ no soporta constructores estáticos

Si puede inicializar una variable miembro normal a través de , entonces, lógicamente, debería poder inicializar variables miembro estáticas a través de un constructor estático. Y aunque algunos lenguajes modernos admiten constructores estáticos para este mismo propósito, C++, desafortunadamente, no es uno de ellos.

Si su variable estática se puede inicializar directamente, entonces no hay necesidad de un constructor: puede definir una variable miembro estática incluso si es privada. Hacemos esto en el ejemplo anterior con s_nextID. Aquí hay otro ejemplo:

clase Algo ( public: static std::vector s_mychars; ); estándar::vector Algo::s_mychars = ( "o", "a", "u", "i", "e" ); // definir una variable miembro estática

clase algo

público:

estático estándar::vector< char >s_mychars;

estándar::vector< char >Algo :: s_mychars = ( "o", "a", "u", "i", "e"); // definir una variable miembro estática

Si inicializar su variable miembro estática requiere ejecutar código (como un bucle), entonces hay algunas formas diferentes de hacerlo. El siguiente método es el mejor. Si bien esto puede ser un poco complicado (por ahora) y probablemente nunca lo necesitarás, puedes saltarte el resto de este tutorial con seguridad si lo deseas.

#incluir #incluir clase Algo (privado: static std::vector s_mychars; público: clase _nested // define una clase anidada llamada _nested ( public: _nested() // el constructor _nested inicializa nuestra variable miembro estática ( s_mychars.push_back("o"); s_mychars.push_back("a"); s_mychars.push_back ("u"); s_mychars.push_back("yo"); s_mychars.push_back("e");<< element << " "; } private: static _nested s_initializer; // используем статический объект класса _nested для гарантии того, что конструктор _nested выполнится }; std::vector// método estático para salida s_mychars static void getSomething() ( for (auto const &element: s_mychars) std::cout

#incluir

#incluir

clase algo

privado :

estático estándar::vector< char >s_mychars;

público:

Algo::s_mychars; // definimos nuestra variable miembro estática Something::_nested Something::s_initializer; // definimos nuestro s_initializer estático, que llamará al constructor _nested para inicializar s_mychars int main() ( Something::getSomething(); return 0; ) clase_anidada

público:

// define una clase anidada llamada _nested anidado()

// el constructor _nested inicializa nuestra variable miembro estática

s_mychars. push_back("o");

s_mychars. push_back("a");

s_mychars. push_back("u");

s_mychars. push_back("yo");

s_mychars. push_back("e");

Última actualización: 25/12/2018

Además de los campos, métodos y propiedades habituales, una clase puede tener campos, métodos y propiedades estáticos. Los campos, métodos y propiedades estáticos se aplican a toda la clase y para acceder a dichos miembros de la clase no es necesario crear una instancia de la clase. Por ejemplo:

Cuenta de clase (bono decimal estático público = 100; suma total decimal pública; cuenta pública (suma decimal) (suma total = suma + bonificación;)) programa de clase ( static void Main (argumentos de cadena) ( Console.WriteLine(Account.bonus); / / 100 Cuenta.bonus += 200; Cuenta cuenta1 = nueva Cuenta(150); Consola.WriteLine(cuenta1.totalSum); // 450 Cuenta cuenta2 = nueva Cuenta(1000);

En este caso, la clase Cuenta tiene dos campos: bonificación y suma total. El campo de bonificación es estático, por lo que almacena el estado de la clase como un todo, en lugar de un objeto individual. Y entonces podemos referirnos a este campo por el nombre de la clase:

Console.WriteLine(Cuenta.bonus); Bono.cuenta += 200;

En el nivel de memoria para campos estáticos, se creará una región de memoria que será común a todos los objetos de la clase.

En este caso, la memoria para variables estáticas se asigna incluso si no se crea ningún objeto de esta clase.

Propiedades y métodos estáticos

De manera similar, podemos crear y utilizar métodos y propiedades estáticos:< MinSum) throw new Exception("Недопустимая сумма!"); Sum = sum; Rate = rate; } private static decimal minSum = 100; // минимальная допустимая сумма для всех счетов public static decimal MinSum { get { return minSum; } set { if(value>0) sumamin = valor; ) ) suma decimal pública ( get; conjunto privado; ) // monto en la cuenta tasa decimal pública ( get; conjunto privado; ) // tasa de interés // cálculo del monto en la cuenta después de un cierto período a una tasa determinada público decimal estático GetSum(suma decimal, tasa decimal, período int) (resultado decimal = suma; for (int i = 1; i<= period; i++) result = result + result * rate / 100; return result; } }

La variable minSum, la propiedad MinSum y el método GetSum se definen aquí con la palabra clave estática, lo que significa que son estáticos.

La variable minSum y la propiedad MinSum representan el monto mínimo permitido para crear una factura. Este indicador no se aplica a ninguna cuenta específica, sino que se aplica a todas las cuentas en general. Si cambiamos este indicador para una cuenta, también debería cambiar para la otra cuenta. Es decir, a diferencia de las propiedades Sum y Rate, que almacenan el estado de un objeto, la variable minSum almacena el estado de todos los objetos de una clase determinada.

Lo mismo ocurre con el método GetSum: calcula el monto en la cuenta después de un período determinado a una tasa de interés determinada por un monto inicial determinado. La llamada y el resultado de este método no dependen de un objeto específico ni de su estado.

Por tanto, las variables y propiedades que almacenan estados comunes a todos los objetos de una clase deben definirse como estáticas. Y también los métodos que definen el comportamiento común a todos los objetos también deben declararse como estáticos.

Los miembros estáticos de una clase son comunes a todos los objetos de esa clase, por lo que se debe hacer referencia a ellos por el nombre de clase:

Tenga en cuenta que los métodos estáticos solo pueden acceder a miembros estáticos de una clase. No podemos acceder a métodos, campos o propiedades no estáticos dentro de un método estático.

Los campos estáticos se utilizan a menudo para almacenar contadores. Por ejemplo, digamos que tenemos una clase de Usuario y queremos tener un contador que nos permita saber cuántos objetos de Usuario se han creado:

Usuario de clase (contador int estático privado = 0; Usuario público() (contador++;) DisplayCounter vacío estático público() (Consola.WriteLine($"Objetos de usuario creados (contador)");)) Programa de clase (vacío estático Principal(cadena) args) ( Usuario usuario1 = nuevo Usuario(); Usuario usuario2 = nuevo Usuario(); Usuario usuario3 = nuevo Usuario(); Usuario usuario4 = nuevo Usuario(); Usuario usuario5 = nuevo Usuario(); Usuario.DisplayCounter(); / / 5 Consola.ReadKey();

constructor estático

Además de los constructores habituales, una clase también puede tener constructores estáticos. Los constructores estáticos tienen las siguientes características distintivas:

    Los constructores estáticos no deben tener un modificador de acceso y no aceptar parámetros.

    Al igual que con los métodos estáticos, los constructores estáticos no pueden usar la palabra clave this para hacer referencia al objeto de clase actual y solo pueden acceder a miembros estáticos de la clase.

    Los constructores estáticos no se pueden llamar manualmente en un programa. Se ejecutan automáticamente la primera vez que se crea un objeto de una clase determinada o la primera vez que se accede a sus miembros estáticos (si los hay).

Los constructores estáticos generalmente se usan para inicializar datos estáticos o realizar acciones que deben realizarse solo una vez.

Definamos un constructor estático:

Usuario de clase ( Usuario estático() ( Console.WriteLine("Se ha creado el primer usuario"); ) ) Programa de clase ( static void Main(string args) ( Usuario usuario1 = nuevo Usuario(); // el constructor estático funcionará aquí Usuario usuario2 = nuevo Usuario();

clases estáticas

Las clases estáticas se declaran con el modificador estático y solo pueden contener campos, propiedades y métodos estáticos. Por ejemplo, si la clase Cuenta tuviera solo variables, propiedades y métodos estáticos, entonces podría declararse como estática:

Cuenta de clase estática (privada estática decimal minSum = 100; // la cantidad mínima permitida para todas las cuentas pública estática decimal MinSum ( get ( return minSum; ) set ( if(value>0) minSum = value; ) ) // contando la cantidad en la cuenta después de un cierto período a una cierta tasa pública estática decimal GetSum (suma decimal, tasa decimal, período int) (resultado decimal = suma; para (int i = 1; i<= period; i++) result = result + result * rate / 100; return result; } }

En C#, un ejemplo ilustrativo de una clase estática es la clase Math, que se utiliza para diversas operaciones matemáticas.

El modificador estático en Java está directamente relacionado con la clase; si el campo es estático, entonces pertenece a la clase, si el método es estático, de manera similar, pertenece a la clase. En base a esto, puede acceder a un método o campo estático utilizando el nombre de la clase. Por ejemplo, si el campo de recuento es estático en la clase Contador, puede acceder a la variable con una consulta como: Contador.count. Por supuesto, se deben tener en cuenta los modificadores de acceso. Por ejemplo, los campos privados sólo están disponibles dentro de la clase en la que están declarados. Los campos protegidos están disponibles para todas las clases dentro del paquete ( paquete), así como todas las clases descendientes fuera del paquete. Para obtener más detalles, consulte el artículo "privado frente a protegido frente a público". Supongamos que hay un método estático incrementa() en la clase Contador cuyo trabajo es incrementar el recuento del contador. Para llamar a este método, puede utilizar una llamada como Counter.increment() . No es necesario crear una instancia de la clase Counter para acceder a un campo o método estático. Ésta es la diferencia fundamental entre objetos estáticos y NO estáticos (miembros de clase). Nota importante. Recuerde que los miembros de la clase estática pertenecen directamente a la clase, no a su instancia. Es decir, el valor de la variable estática count será el mismo para todos los objetos del tipo Contador. En este artículo, veremos los aspectos fundamentales del uso del modificador estático en Java, así como algunas características que lo ayudarán a comprender conceptos clave de programación.

Lo que todo programador debería saber sobre el modificador estático en Java.

En esta sección, veremos los conceptos básicos del uso de métodos, campos y clases estáticos. Empecemos por las variables.

    NO puede acceder a miembros no estáticos de una clase dentro de un contexto estático, como un método o bloque. Al compilar el código siguiente se producirá un error:

    Contador de clase pública (recuento de int privado; principal vacío estático público (argumentos de cadena) (System. out. println (recuento); // error de tiempo de compilación))

    Este es uno de los errores más comunes que cometen los programadores de Java, especialmente los novatos. Dado que el método principal es estático y la variable de recuento no lo es, en este caso el método println dentro del método principal arrojará un "Error de tiempo de compilación".

    A diferencia de las variables locales, los campos y métodos estáticos NO son seguros para subprocesos en Java. En la práctica, esta es una de las causas más comunes de problemas relacionados con la seguridad de la programación multiproceso. Teniendo en cuenta que cada instancia de una clase tiene la misma copia de una variable estática, dicha variable necesita protección: "bloqueo" por parte de la clase. Por lo tanto, cuando utilice variables estáticas, asegúrese de que estén sincronizadas correctamente para evitar problemas como las condiciones de carrera.

    Los métodos estáticos tienen una ventaja en su uso porque... no es necesario crear un nuevo objeto cada vez para acceder a dichos métodos. Se puede llamar a un método estático utilizando el tipo de clase en la que se definen los métodos. Por eso estos métodos son ideales como métodos de fábrica y métodos de utilidad. La clase java.lang.Math es un gran ejemplo en el que casi todos los métodos son estáticos, que es la misma razón por la que las clases de utilidad en Java son finales.

    Otro punto importante es que no se pueden anular métodos estáticos. Si declara el mismo método en una subclase, es decir método con el mismo nombre y firma, sólo “ocultará” el método de la superclase en lugar de anularlo. Este fenómeno se conoce como métodos de ocultación. Esto significa que cuando se llama a un método estático que está declarado tanto en una clase principal como en una secundaria, el método siempre se llamará en tiempo de compilación según el tipo de variable. A diferencia de la anulación, estos métodos no se ejecutarán mientras el programa se esté ejecutando. Veamos un ejemplo:

    clase Vehículo (público estático vacío kmToMiles (int km) ( System. out. println ( "Dentro de la clase principal/método estático") ; ) ) clase Coche extiende Vehículo (público estático vacío kmToMiles (int km) ( System. out. println ("Dentro de una clase secundaria/método estático"

    ) ;

    ) ) Demostración de clase pública (public static void main (String args) (Vehículo v = auto nuevo (); v. kmToMiles (10); ))

    Salida de consola:

    También puedes declarar una clase estática, con la excepción de las clases de nivel superior. Estas clases se conocen como clases estáticas anidadas. Son útiles para representar conexiones mejoradas. Un excelente ejemplo de una clase estática anidada es HashMap.Entry, que proporciona una estructura de datos dentro de un HashMap. Vale la pena señalar que, al igual que cualquier otra clase interna, las clases anidadas se encuentran en un archivo .class separado. Entonces, si declaraste cinco clases anidadas en tu clase principal, tendrías 6 archivos con una extensión .class. Otro ejemplo de uso es declarar su propio Comparador, por ejemplo AgeComparator en la clase Empleado.

    El modificador estático también se puede declarar en un bloque estático, más conocido como bloque inicializador estático, que se ejecutará cuando se cargue la clase. Si no declara dicho bloque, Java recopilará todos los campos estáticos en una lista y la ejecutará cuando se cargue la clase. Sin embargo, un bloque estático no puede generar excepciones detectadas, pero puede generar excepciones no detectadas. En este caso, se producirá un "Error del inicializador de excepción". En la práctica, Java envolverá cualquier excepción lanzada durante la ejecución e inicialización de campos estáticos en este error. Esta es también la causa más común del "Error de definición de clase no encontrada" porque... la clase no estaba en la memoria cuando se accedió a ella.

    Es útil saber que los métodos estáticos están vinculados en tiempo de compilación, a diferencia de los métodos virtuales o no estáticos vinculantes, que están vinculados en tiempo de ejecución al objeto real. Por lo tanto, los métodos estáticos no se pueden anular en Java porque El polimorfismo en tiempo de ejecución no se aplica a ellos. Esta es una limitación importante a considerar al declarar un método estático. Esto sólo tiene sentido cuando no hay posibilidad o necesidad de anular dicho método mediante clases herederas. Los métodos de fábrica y los métodos de utilidad son buenos ejemplos del uso del modificador estático. Joshua Bloch describió varias ventajas de utilizar un método de fábrica estático sobre un constructor en su libro Effective Java, que es de lectura obligatoria para todo programador del lenguaje.

    Una propiedad importante de un bloque estático es la inicialización. Los campos o variables estáticos se inicializan después de que la clase se carga en la memoria. El orden de inicialización es de arriba a abajo, en el mismo orden en que se describen en el archivo fuente de la clase Java. Dado que los campos estáticos se inicializan de forma segura para subprocesos, esta propiedad también se utiliza para implementar el patrón Singleton. Si no está utilizando una lista Enum como Singleton, por una razón u otra, existe una buena alternativa para usted. Pero en este caso hay que tener en cuenta que no se trata de una inicialización “perezosa”. Esto significa que el campo estático se inicializará ANTES de que alguien lo "pida". Si el objeto consume muchos recursos o se usa con poca frecuencia, inicializarlo en un bloque estático no funcionará a su favor.

    Durante la serialización, al igual que las variables transitorias, los campos estáticos no se serializan. De hecho, si guarda datos en un campo estático, luego de la deserialización el nuevo objeto contendrá su valor principal (predeterminado), por ejemplo, si el campo estático era una variable int, entonces su valor después de la deserialización será cero, si el El tipo flotante es 0.0, si el tipo de objeto es nulo. Honestamente, esta es una de las preguntas más frecuentes sobre la serialización en las entrevistas sobre Java. ¡No almacene los datos más importantes sobre un objeto en un campo estático!

    Y finalmente, hablemos de la importación estática. Este modificador tiene mucho en común con la declaración de importación estándar, pero a diferencia de ella, le permite importar uno o todos los miembros estáticos de una clase. Al importar métodos estáticos, se puede acceder a ellos como si estuvieran definidos en la misma clase, de manera similar al importar campos, podemos acceder a ellos sin especificar el nombre de la clase. Esta característica se introdujo en la versión 1.5 de Java y, cuando se usa correctamente, mejora la legibilidad del código. Este diseño se encuentra con mayor frecuencia en las pruebas. unidad conjunta, porque Casi todos los desarrolladores de pruebas utilizan importaciones estáticas para métodos de afirmación, como afirmarEquals() y sus duplicados sobrecargados. Si nada está claro, bienvenido a recibir información adicional.

    Eso es todo. Todos los puntos anteriores sobre el modificador. estático Todo programador debe conocer Java. Este artículo cubrió información básica sobre variables estáticas, campos, métodos, bloques de inicialización e importaciones. Incluyendo algunas propiedades importantes, cuyo conocimiento es fundamental a la hora de escribir y comprender programas en Java. Espero que todos los desarrolladores perfeccionen sus habilidades en el uso de conceptos estáticos porque... Esto es muy importante para una programación seria".



 Arriba