« Bonjour, Amigo ! On me dit que Rishi t'a expliqué quelque chose de nouveau et d'excitant !? »

« Exact, Kim »

« Mon sujet ne sera pas moins intéressant. Je voudrais te parler de la façon dont les classes sont chargées en mémoire. »

Les classes en Java sont des fichiers sur le disque qui contiennent du bytecode, à savoir le code Java compilé.

« Oui, je m'en souviens. »

La machine Java ne les charge pas si elle n'en a pas besoin. Dès qu'il y a un appel à une classe quelque part dans le code, la machine Java vérifie si elle est chargée. Et si ce n'est pas le cas, il la charge et l'initialise.

Initialiser une classe consiste à attribuer des valeurs à toutes ses variables statiques et à appeler tous les blocs d'initialisation statiques.

« Cela semble similaire à l'appel d'un constructeur sur un objet. Mais qu'est-ce qu'un bloc d'initialisation statique ? »

« Si tu as besoin d'exécuter du code complexe (par exemple, le chargement de quelque chose à partir d'un fichier) pour initialiser des objets, nous pouvons le faire dans un constructeur. Cependant, les variables statiques n'ont pas cette opportunité. Mais puisque le besoin n'en est pas moins réel, tu peux ajouter un ou des blocs d'initialisation statiques aux classes. Ce sont essentiellement les équivalents des constructeurs statiques. »

Voici à quoi ça ressemble :

Code Ce qui se passe vraiment
class Cat
{
public static int catCount = 0 ;
public static String namePrefix;

static
{
Properties p = new Properties();
p.loadFromFile("cat.properties");
namePrefix = p.get("name-prefix");
}

public static int maxCatCount = 50;

static
{
Properties p = new Properties();
p.loadFromFile("max.properties");
if (p.get("cat-max") != null)
maxCatCount = p.getInt("cat-max");
}

}
class Cat
{
public static int catCount;
public static String namePrefix;
public static int maxCatCount;

//Static constructors aren't allowed in Java,
//but if they were, everything
//would look like this
public static Cat()
{
catCount = 0;

Properties p = new Properties();
p.loadFromFile("cat.properties");
namePrefix = p.get("name-prefix");

maxCatCount = 50;

Properties p2 = new Properties();
p2.loadFromFile("max.properties");
if (p2.get("cat-max")!=null)
maxCatCount = p2.getInt("cat-max");
}
}

Ça ressemble beaucoup à ce qui se passe quand un constructeur est appelé. Je l'ai même écrit sous forme de constructeur statique (non existant).

« Oui, je comprends. »

« Très bien. »