Optimisation du workflow dans IntelliJ IDEA
Pour gagner en efficacité lors du développement Java, la maîtrise des raccourcis clavier est essentielle :
- Ctrl + D : Dupliquer la ligne actuelle.
- Ctrl + Y : Supprimer la ligne.
- Alt + Entrée : Suggestions de correction et importations automatiques.
- Ctrl + Alt + L : Réindenter et formater le code selon les standards.
- Alt + Insert : Générer automatiquement des constructeurs, getters, setters ou méthodes
toString(). - Ctrl + H : Afficher la hiérarchie de classes.
Gestion des Paquetages (Packages)
Les paquets servent à organiser les classses, à éviter les conflits de noms et à gérer les niveaux de visibilité.
Syntaxe et nomenclature
Un paquet se déclare au tout début du fichier source :
package fr.entreprise.projet.module;
La convention veut que l'on utilise le nom de domaine inversé de l'organisation. Par exemple, com.google.search.
Importation de classes
Pour utiliser une classe située dans un autre paquetage, on utilise le mot-clé import :
import java.util.ArrayList; // Import spécifique
import java.util.*; // Import de tout le paquetage (non recommandé)
Modificateurs d'accès
Java propose quatre niveaux de visibilité pour contrôler l'accès aux données :
| Modificateur | Classe | Package | Sous-classe | Monde |
|---|---|---|---|---|
public |
Oui | Oui | Oui | Oui |
protected |
Oui | Oui | Oui | Non |
| (Défaut) | Oui | Oui | Non | Non |
private |
Oui | Non | Non | Non |
L'Encapsulation
L'encapsulation consiste à protéger l'état interne d'un objet en masquant ses attributs et en n'autorisant l'accès que via des méthodes publiques.
Mise en œuvre
- Déclarer les attributs en
private. - Créer des méthodes
public setXxx()pour modifier les valeurs avec validation. - Créer des méthodes
public getXxx()pour lire les valeurs.
class CompteBancaire {
private double solde;
public void deposer(double montant) {
if (montant > 0) {
this.solde += montant;
} else {
System.out.println("Montant invalide");
}
}
public double getSolde() {
return solde;
}
}
L'Héritage
L'héritage permet de créer une nouvelle classe à partir d'une classe existante pour réutiliser du code et établir une hiérarchie "est-un".
Syntaxe et règles
class Vehicule {
public void rouler() {
System.out.println("Le véhicule se déplace");
}
}
class Voiture extends Vehicule {
// Hérite de rouler()
}
- Java ne supporte que l'héritage simple (une seule classe parente directe).
- Toute classe hérite implicitement de la classe
Object. - Le constructeur de la classe fille appelle par défaut le constructeur sans argument de la classe parente.
Le mot-clé super
super fait référence à l'instance de la classe parente. Il est utilisé pour :
- Appeler un constructeur spécifique du parent :
super(args). - Accéder à une méthode ou un attribut du parent masqué par une redéfinition.
Redéfinition de méthodes (Override)
La redéfinition permet à une classe fille de fournir une implémentation spécifique d'une méthode déjà définie dans sa classe parente.
class Animal {
public void emettreSon() {
System.out.println("Son d'animal");
}
}
class Chat extends Animal {
@Override
public void emettreSon() {
System.out.println("Miaou");
}
}
Différence avec la surcharge (Overload) : La surcharge utilise le même nom de méthode mais avec des signatures de paramètres différentes dans la même classe.
Le Polymorphisme
Le polymorphisme permet d'utiliser un objet sous plusieurs formes. Un objet d'une classe fille peut être référencé par une variable du type de la classe parente.
Upcasting et Downcasting
// Upcasting : automatique et sûr
Animal monChat = new Chat();
// Downcasting : nécessite un cast explicite et une vérification
if (monChat instanceof Chat) {
Chat vraiChat = (Chat) monChat;
vraiChat.ronronner();
}
Mécanisme de liaison dynamique
En Java, lors de l'appel d'une méthode sur un objet polymorphe, c'est la méthode de la classe de l'instance réelle (type d'exécution) qui est appelée, et non celle du type de référence.
La classe Object
Toutes les classes en Java héritent de java.lang.Object. Voici les méthodes clés à redéfinir :
equals(Object obj): Compare le contenu de deux objets plutôt que leurs adresses mémoire.hashCode(): Retourne une valeur entière unique pour l'objet, utilisée dans les structures de données commeHashMap.toString(): Retourne une représentation textuelle de l'objet.
Débogage (Debug)
Le débogage permet de suivre l'exécution du programme ligne par ligne pour identifier les erreurs logiques.
- Point d'arrêt (Breakpoint) : Cliquez dans la marge pour stopper l'exécution.
- Step Over (F8) : Exécute la ligne suivante sans entrer dans les méthodes.
- Step Into (F7) : Entre à l'intérieur de la méthode appelée.
- Resume (F9) : Continue l'exécution jusqu'au prochain point d'arrêt.
Étude de cas : Système de Gestion Budgétaire (version POO)
Voici une implémentation simplifiée d'un outil de suivi de dépenses en utilisant les principes de la POO :
class Transaction {
private String libelle;
private double montant;
public Transaction(String libelle, double montant) {
this.libelle = libelle;
this.montant = montant;
}
@Override
public String toString() {
return libelle + " : " + montant + " €";
}
}
class Portefeuille {
private double soldeTotal;
private List<Transaction> historique = new ArrayList<>();
public void ajouterRevenu(double montant) {
if (montant > 0) {
soldeTotal += montant;
historique.add(new Transaction("Revenu", montant));
}
}
public void effectuerDepense(String description, double montant) {
if (montant <= soldeTotal) {
soldeTotal -= montant;
historique.add(new Transaction(description, -montant));
} else {
System.out.println("Fonds insuffisants");
}
}
public void afficherEtat() {
System.out.println("Solde actuel : " + soldeTotal + " €");
historique.forEach(System.out::println);
}
}