Un bloque de inicialización estática es un bloque de código que se ejecuta durante la carga inicial de la clase en la JVM, antes del primer uso de cualquier miembro estático o la creación de una instancia de la clase.
Historia de la cuestión:
Java desde el principio proporcionó campos estáticos para almacenar valores comunes a todas las instancias. Para la inicialización no estándar o cálculos complejos al inicio de la clase, se introdujeron los bloques static.
Problema:
Los campos estáticos normales se pueden inicializar directamente al declararlos, pero cuando la inicialización es larga, requiere acceso a otras clases/archivos/bases de datos, o depende de una lógica compleja, es necesario usar bloques static. Un uso incorrecto de los bloques static puede llevar a un comportamiento inesperado durante la carga de clases, dificultades para probar e incluso deadlocks.
Solución:
Los bloques static se utilizan solo para la inicialización compleja de recursos estáticos, cuando no se pueden expresar mediante una sola expresión. Un buen ejemplo es la carga de controladores JDBC, la lectura de configuraciones:
public class Config { public static Properties properties; static { properties = new Properties(); try (InputStream in = new FileInputStream("config.properties")) { properties.load(in); } catch (IOException e) { throw new ExceptionInInitializerError(e); } } }
Características clave:
¿Se puede usar return dentro de un bloque estático?
No, la declaración return no es válida en bloques static. Se puede usar throw para lanzar una excepción.
¿Cuándo se ejecuta el bloque estático, al cargar la clase o al crear el objeto?
El bloque estático se ejecuta una vez al cargar la clase, incluso si no se crea ningún objeto.
¿Se pueden tener varios bloques static en una misma clase? ¿En qué orden se ejecutan?
Sí, se pueden declarar varios bloques estáticos. Se ejecutan en el orden en que aparecen en el código de la clase.
En la clase, el bloque static lee un archivo grande y se conecta a un servicio externo. En pruebas o utilidades simples, la clase JVM se carga lentamente.
Ventajas:
Desventajas:
El bloque static verifica la existencia de una licencia de software al inicio, lanza ExceptionInInitializerError en caso de error.
Ventajas:
Desventajas: