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
Personnageavec 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;
}
}
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;
}
}
Dans IntelliJ IDEA, vous pouvez générer automatiquement les getters/setters : clic droit dans la classe → Generate → Getter 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
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).
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.
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.
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.
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.