Una especie de pregunta de curiosidad, cuando estoy escribiendo un programa en Java que se parece a esto:
public class Basic { public static HashMap<String,Integer> my_map = new HashMap<>(); public static void main(String[] a) { mymap.forEach( (str,i) -> System.out.println(str+": "+i) ); } }esencialmente una estructura para contener y procesar algunos datos estáticos/globales, y luego decir, por ejemplo (para la limpieza del código) mis valores en una clase diferente en un archivo diferente que cargaría todos los valores en esa clase principal al iniciar de esta manera:
public class Foo { static final String a = def("APPLE"); static final String b = def("BUMBLEBEE"); static final String c = def("CARTOGRAPHER"); static String def (String s) { Basic.my_map.put(s, new Random().nextInt(256)); return s; } }ahora, para que este código funcione correctamente (es decir, al iniciar el programa, se imprimen todos los valores definidos en Foo), mi instinto es definir una función vacía dentro de Foo y llamarla justo al comienzo de main,
y básicamente me preguntaba si esto era realmente necesario. ¿Se iniciarán todas las variables estáticas antes de que se inicie el programa o al menos antes de que se use cualquier código que afecten? ¿O siempre es mejor asegurarse manualmente de que una clase se haya cargado antes de interactuar con los datos con los que podría haber interactuado?
Una clase se carga cuando se accede, incluso para leer solo un campo estático de ella, luego todos sus campos estáticos se inicializarán (a nulo si no están asignados) y luego se ejecutará cualquier bloque estático.
Entonces, cuando su clase de "relleno" accede al nombre de la clase que debe "rellenarse", hace que se cargue.
En su ejemplo, nada llama/se refiere a "Foo". Suponiendo que solo ejecute el método principal de Basic, entonces debería ejecutarse vacío.