Blocs statiques
Fait partie de la section Programmation Orientée Objet du Journey Java de Coddy — leçon 17 sur 87.
Parfois, vous devez initialiser des variables statiques avec une logique plus complexe qu'une simple affectation. Un bloc statique (également appelé initialiseur statique) s'exécute une seule fois lors du premier chargement de la classe, avant que des objets ne soient créés ou que des méthodes statiques ne soient appelées.
public class DatabaseConfig {
private static String connectionString;
private static int maxConnections;
static {
// Logique d'initialisation complexe
connectionString = "jdbc:mysql://localhost:3306/mydb";
maxConnections = 10;
System.out.println("Database configuration loaded");
}
}Le bloc statique s'exécute automatiquement lorsque la classe est chargée en mémoire. Cela ne se produit qu'une seule fois, quel que soit le nombre d'objets que vous créez. C'est parfait pour l'initialisation qui nécessite plusieurs instructions, des calculs ou une logique conditionnelle.
Vous pouvez avoir plusieurs blocs statiques dans une classe, et ils s'exécutent dans l'ordre dans lequel ils apparaissent :
public class AppSettings {
private static int[] values;
static {
values = new int[5];
}
static {
for (int i = 0; i < values.length; i++) {
values[i] = i * 10;
}
}
}Les blocs statiques sont couramment utilisés pour initialiser des tableaux ou des collections statiques, définir des valeurs de configuration qui nécessitent des calculs et effectuer des tâches de configuration uniques au niveau de la classe.
Défi
FacileConstruisons un système GameConfig qui utilise des blocs statiques pour initialiser les paramètres du jeu lors du premier chargement de la classe. C'est parfait pour une configuration qui doit être calculée ou configurée une seule fois avant la création de tout objet de jeu.
Vous allez créer deux fichiers pour organiser votre code :
GameConfig.java: Créez une classe de configuration qui initialise ses paramètres à l'aide de blocs statiques :- Un tableau statique privé
levelThresholds(int[]) qui stocke le score nécessaire pour atteindre chaque niveau - Une variable statique privée
maxLevel(int) stockant le nombre total de niveaux - Une variable statique privée
configLoaded(boolean) pour suivre si l'initialisation a eu lieu - Utilisez un bloc statique pour initialiser
maxLevelà 5 et afficher"Initializing game configuration..." - Utilisez un deuxième bloc statique pour créer le tableau
levelThresholdsavec une taille égale àmaxLevel, puis remplissez-le de sorte que chaque niveau nécessitelevel * 100points (le niveau 1 nécessite 100, le niveau 2 nécessite 200, etc.), et définissezconfigLoadedsurtrue - Une méthode statique
getThreshold(int level)qui renvoie le seuil de score pour ce niveau (les niveaux sont indexés à partir de 1) - Une méthode statique
getMaxLevel()qui renvoie le niveau maximum - Une méthode statique
isConfigLoaded()qui renvoie si la configuration a été chargée
- Un tableau statique privé
Main.java: Démontrez que les blocs statiques s'exécutent automatiquement lorsque la classe est accédée. Vous recevrez une entrée : un numéro de niveau à interroger. Affichez quatre lignes :Config loaded: trueouConfig loaded: falseMax level: [maxLevel]Level [level] threshold: [threshold]Level 1 threshold: [threshold](affichez toujours le niveau 1 également)
Vous recevrez une entrée : le numéro de niveau (int) à interroger.
Remarquez comment le message d'initialisation s'affiche avant que tout code de votre Main ne s'exécute - c'est le bloc statique qui s'exécute lors du premier chargement de la classe !
Aide-mémoire
Un bloc statique (ou initialiseur statique) s'exécute une seule fois lors du premier chargement de la classe, avant que tout objet ne soit créé ou que des méthodes statiques ne soient appelées. Il est utilisé pour une logique d'initialisation complexe qui nécessite plusieurs instructions.
public class Example {
private static String value;
static {
// Logique d'initialisation
value = "initialized";
System.out.println("Static block executed");
}
}Les blocs statiques s'exécutent automatiquement lorsque la classe est chargée en mémoire, une seule fois quel que soit le nombre d'objets créés.
Vous pouvez avoir plusieurs blocs statiques dans une classe. Ils s'exécutent dans l'ordre dans lequel ils apparaissent :
public class Example {
private static int[] values;
static {
values = new int[5];
}
static {
for (int i = 0; i < values.length; i++) {
values[i] = i * 10;
}
}
}Les utilisations courantes incluent l'initialisation de tableaux ou de collections statiques, la configuration de valeurs de configuration nécessitant des calculs et l'exécution de tâches de configuration uniques au niveau de la classe.
Essayez vous-même
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int level = scanner.nextInt();
// TODO: Accéder à GameConfig pour démontrer l'exécution du bloc statique
// Les blocs statiques dans GameConfig s'exécuteront automatiquement lors du premier accès à la classe
// TODO: Afficher si la configuration est chargée
// Format: "Config loaded: true" ou "Config loaded: false"
// TODO: Afficher le niveau maximum
// Format: "Max level: [maxLevel]"
// TODO: Afficher le seuil pour le niveau saisi
// Format: "Level [level] threshold: [threshold]"
// TODO: Afficher le seuil pour le niveau 1
// Format: "Level 1 threshold: [threshold]"
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses vs ObjetsLe mot-clé thisMéthodesChamps (Attributs)Méthode constructeurSurcharge de constructeurRécapitulatif - Calculatrice simple4Héritage
Héritage de base (extends)Le mot-clé superRedéfinition de méthode (@Override)Chaînage de constructeursLa classe ObjectHéritage simple et multiniveauPourquoi pas d'héritage multiple de classesRécapitulatif - Hiérarchie des employés7Méthodes spéciales et classe Object
Méthode toString()equals() et hashCode()Méthode clone()compareTo() et ComparableInterface ComparatorRécapitulatif - Tri personnalisé2Modificateurs d'accès et Encapsulation
Aperçu des niveaux d'accèsMéthodes Getter et SetterMasquage d'informationsLe mot-clé finalRécapitulatif - Gestionnaire de compte bancaire5Polymorphisme
Bases de la surcharge de méthodesRedéfinition de méthodes (Run-Time)Upcasting et DowncastingL'opérateur instanceofClasses et méthodes abstraitesRécapitulatif - Calculateur de formes8Concepts avancés de la POO
Composition vs HéritageAgrégation vs CompositionClasses internes, imbriquées et anonymesEnums et méthodes d'EnumRecords (Java 16+)Classes scellées (Java 17+)11Patrons de conception, partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron MonteurPatron ObservateurPatron Stratégie3Propriétés de classe et membres statiques
Variables d'instance vs variables statiquesMéthodes statiquesBlocs statiquesConstantes (static final)Récapitulatif - Compteur et utilitaire6Interfaces et Classes Abstraites
Introduction aux InterfacesImplémentation d'InterfacesImplémentation d'Interfaces MultiplesDefault et Static dans les InterfacesClasses Abstraites vs InterfacesInterfaces FonctionnellesRécapitulatif - Système de Paiement9La généricité
Introduction à la généricitéClasses génériquesMéthodes génériquesParamètres de type bornésWildcards (?, extends, super)Récapitulatif - Conteneur générique12Patrons de conception, partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Template MethodPatron ÉtatPatron CompositePatron Itérateur