Aller au contenu principal

Statique

En Java, le terme "statique" peut s'appliquer à différents éléments :

  • Attributs (variables) statiques : Ils appartiennent à la classe elle-même plutôt qu'à une instance spécifique de la classe. Il n'existe qu'une seule copie de l'attribut statique, partagée par tous les objets de cette classe.
  • Méthodes statiques : Elles peuvent être appelées directement sur la classe, sans avoir besoin de créer un objet de cette classe. Elles ne peuvent pas accéder aux attributs non statiques (d'instance) de la classe.
  • Objets statiques ou classes statiques : Les objets ou classes statiques peuvent être utilisés pour créer des instances uniques ou des utilitaires qui ne nécessitent pas d'instanciation répétée.

Pourquoi utiliser des classes statiques ?

Les classes statiques sont utiles dans les situations suivantes :

  • Variable statique : Lorsque vous avez besoin d'une variable qui soit commune à tous les objets d'une classe, vous pouvez la déclarer comme statique. Par exemple, un compteur du nombre d'instances créées d'une classe.
  • Méthodes utilitaires : Les méthodes statiques sont souvent utilisées pour créer des fonctions utilitaires qui peuvent être appelées directement sur la classe, sans avoir besoin d'instanciation. Par exemple, des méthodes pour effectuer des opérations mathématiques ou manipuler des chaînes de caractères.
  • Regroupement de constantes : Les classes statiques peuvent être utilisées pour regrouper des constantes qui sont liées entre elles. Cela permet d'organiser le code et de faciliter la maintenance.

Exemple 1 : Variable statique partagée

public class Compteur {
public static int nbInstances = 0; // variable statique partagée

public Compteur() {
nbInstances++; // incrémente le compteur à chaque création d'objet
}
}

public class Main {
public static void main(String[] args) {
new Compteur();
new Compteur();
new Compteur();

System.out.println("Nombre d'instances créées : " + Compteur.nbInstances); // affiche 3
}
}

Exemple 2 : Méthode statique utilitaire

public class MathUtils {

public static int addition(int a, int b) {
return a + b;
}

public static int soustraction(int a, int b) {
return a - b;
}

public static double calculerCercle(double rayon) {
return 3.14159 * rayon * rayon;
}
}

public class Main {
public static void main(String[] args) {
int resultat = MathUtils.addition(5, 3); // appel direct de la méthode statique
System.out.println("5 + 3 = " + resultat);

double surface = MathUtils.calculerCercle(5);
System.out.println("La surface du cercle est : " + surface);
}
}

Exemple 3 : Regroupement de constantes

public class Constantes {
public static final double PI = 3.14159;
public static final double E = 2.71828;
public static final int MAX_UTILISATEURS = 100;
public static final String VERSION_APP = "1.0.0";
}

public class Main {
public static void main(String[] args) {
System.out.println("Version : " + Constantes.VERSION_APP);
System.out.println("Pi = " + Constantes.PI);
System.out.println("Nombre max d'utilisateurs : " + Constantes.MAX_UTILISATEURS);
}
}

Exemple d'objet statique unique (Singleton)

public class Database {
// Instance statique unique
private static Database instance;

// Constructeur privé pour éviter l'instanciation directe
private Database() {
}

// Méthode statique pour obtenir l'instance unique
public static Database getInstance() {
if (instance == null) {
instance = new Database();
}
return instance;
}

public void connect() {
System.out.println("Connexion à la base de données établie");
}
}

public class Main {
public static void main(String[] args) {
// Obtenir l'instance unique
Database db1 = Database.getInstance();
Database db2 = Database.getInstance();

// db1 et db2 font référence au même objet
System.out.println(db1 == db2); // affiche true

db1.connect(); // Connexion à la base de données établie
}
}

Points importants à retenir

  • Les membres statiques (attributs et méthodes) appartiennent à la classe, pas à ses instances.
  • On accède aux membres statiques en utilisant le nom de la classe, pas une référence d'objet.
  • Les méthodes statiques ne peuvent pas accéder aux membres d'instance (non statiques) de la classe.
  • Attention : Utilisez le statique avec prudence. Les variables statiques partagent leur état entre toutes les instances et peuvent causer des problèmes de concurrence dans les applications multi-thread. Privilégiez les instances d'objet quand c'est possible.