Aller au contenu principal

2) Organiser son code

Organiser son code avec des classes

Dans la séance précédente, les personnages n'étaient que des String. Un vrai personnage de RPG a un nom, des points de vie et une force. Il est temps d'organiser ces données dans une classe.

Objectifs de la séance

  • Comprendre ce qu'est une classe et un objet
  • Créer une classe Personnage avec des attributs et un constructeur
  • Écrire des getters, des setters et une méthode afficher()
  • Instancier plusieurs personnages et les stocker dans une liste

Notions théoriques

Qu'est-ce qu'une classe ?

Une classe est un modèle (ou plan) qui décrit les attributs (données) et les méthodes (comportements) d'un type d'objet. Un objet est une instance concrète de ce modèle.

// Déclaration de la classe (le modèle)
public class Personnage {
String nom;
int pointsDeVie;
int force;
}

// Création d'un objet (une instance)
Personnage p = new Personnage();

Le constructeur

Le constructeur est une méthode spéciale qui porte le même nom que la classe. Il est appelé automatiquement au moment de la création d'un objet avec new. Il sert à initialiser les attributs.

public class Personnage {
String nom;
int pointsDeVie;
int force;

// Constructeur paramétré
public Personnage(String nom, int pointsDeVie, int force) {
this.nom = nom;
this.pointsDeVie = pointsDeVie;
this.force = force;
}
}
info

this.nom désigne l'attribut de l'objet en cours de création. nom (sans this) désigne le paramètre du constructeur. Le mot-clé this lève l'ambiguïté quand les deux ont le même nom.

Getters et setters

Par convention, les attributs d'une classe sont privés (private). On y accède via des méthodes publiques :

  • Un getter (getNom()) retourne la valeur d'un attribut.
  • Un setter (setNom(String nom)) modifie la valeur d'un attribut.
public class Personnage {
private String nom;
private int pointsDeVie;
private int force;

public Personnage(String nom, int pointsDeVie, int force) {
this.nom = nom;
this.pointsDeVie = pointsDeVie;
this.force = force;
}

public String getNom() {
return nom;
}

public void setNom(String nom) {
this.nom = nom;
}

public int getPointsDeVie() {
return pointsDeVie;
}

public int getForce() {
return force;
}
}
attention

Dans IntelliJ IDEA, vous pouvez générer automatiquement les getters/setters : clic droit dans la classe → GenerateGetter and Setter. Cela évite les fautes de frappe !

Méthode afficher()

Une méthode d'instance (sans static) peut accéder directement aux attributs de l'objet sur lequel elle est appelée.

public void afficher() {
System.out.println("Nom : " + nom + " | PV : " + pointsDeVie + " | Force : " + force);
}

Exemple pratique

import java.util.ArrayList;

public class Main {

public static void main(String[] args) {
Personnage guerrier = new Personnage("Aragorn", 150, 30);
Personnage mage = new Personnage("Gandalf", 100, 20);
Personnage archer = new Personnage("Legolas", 120, 25);

ArrayList<Personnage> personnages = new ArrayList<>();
personnages.add(guerrier);
personnages.add(mage);
personnages.add(archer);

System.out.println("=== Équipe ===");
for (Personnage p : personnages) {
p.afficher();
}
}
}

Sortie attendue :

=== Équipe ===
Nom : Aragorn | PV : 150 | Force : 30
Nom : Gandalf | PV : 100 | Force : 20
Nom : Legolas | PV : 120 | Force : 25

Test de mémorisation/compréhension


Quel mot-clé utilise-t-on pour créer un objet en Java ?


À quoi sert le constructeur d'une classe ?


Quelle est la visibilité recommandée pour les attributs d'une classe ?


Que retourne un getter ?


À quoi sert le mot-clé `this` dans un constructeur ?


TP pour réfléchir et résoudre des problèmes

Vous allez créer la classe Personnage complète, puis l'utiliser dans Main pour afficher une liste de personnages.

Étape 1 — Déclarer les attributs de la classe Personnage

Créez le fichier Personnage.java. Déclarez trois attributs privés : nom (String), pointsDeVie (int) et force (int).


Bonne pratique - Toujours déclarer les attributs private

Déclarer les attributs private empêche leur modification directe depuis l'extérieur de la classe. C'est le principe d'encapsulation : vous contrôlez comment les données sont lues et modifiées grâce aux getters et setters.

Étape 2 — Écrire le constructeur paramétré

Le constructeur reçoit les trois valeurs et les affecte aux attributs avec this.


Bonne pratique - Constructeur paramétré vs constructeur vide

Quand votre classe a des données obligatoires (comme le nom d'un personnage), préférez un constructeur paramétré qui force l'initialisation dès la création. Cela évite d'avoir des objets dans un état incohérent.

Étape 3 — Écrire la méthode afficher()

La méthode afficher() doit afficher le nom, les points de vie et la force du personnage sur une seule ligne.


Bonne pratique - Méthode toString()

En Java, il est courant de définir une méthode toString() à la place de afficher(). Cela permet d'afficher l'objet simplement avec System.out.println(personnage). Nous verrons cette convention plus en détail avec l'héritage.

Étape 4 — Instancier et afficher une liste de personnages

Dans Main, créez trois personnages, stockez-les dans une ArrayList<Personnage> et affichez-les tous.


Bonne pratique - Nommer les objets de façon significative

Nommer votre variable aragorn plutôt que p1 rend le code bien plus lisible. En Java, les variables d'objet suivent la convention camelCase avec une minuscule en premier.

📌 Une solution