📘 Le cours : découper en méthodes
Une méthode (une « fonction » en Java) regroupe du code nommé et réutilisable. Découper un programme en petites méthodes, chacune avec une seule mission, le rend plus lisible et plus simple à tester. Tu en utilises déjà : main, println, Math.sqrt.
Anatomie d'une méthode
static typeDeRetour nomDeLaMethode(type param1, type param2) {
// corps de la méthode
return valeur; // du type annoncé
}
void signifie que la méthode ne renvoie rien ; sinon, tous les chemins d'exécution doivent se terminer par un return (le compilateur le vérifie).
- Les paramètres sont des variables locales initialisées avec les valeurs de l'appel.
- Par convention, les noms de méthodes sont en minuscules avec majuscule à chaque mot :
calculerMoyenne.
Pourquoi static ?
main est static : il s'exécute sans qu'aucun objet n'existe. Depuis main, on ne peut appeler directement que des méthodes static de la même classe. Les méthodes qui travaillent sur un objet (sans static) sont vues dans POO.
Méthode sans résultat
public class Barre {
static void barre(int longueur) {
for (int i = 0; i < longueur; i++) {
System.out.print("=");
}
System.out.println();
}
public static void main(String[] args) {
barre(10);
System.out.println("NSI");
barre(10);
}
}
Affichage==========
NSI
==========
Surcharge : même nom, paramètres différents
Java permet plusieurs méthodes de même nom si leurs paramètres diffèrent (nombre ou types). Le compilateur choisit la bonne d'après les arguments de l'appel. Le type de retour seul ne suffit pas à les distinguer.
public class Surcharge {
static int max(int a, int b) {
return (a > b) ? a : b;
}
static double max(double a, double b) {
return (a > b) ? a : b;
}
static int max(int a, int b, int c) {
return max(max(a, b), c);
}
public static void main(String[] args) {
System.out.println(max(3, 8));
System.out.println(max(2.5, 1.5));
System.out.println(max(4, 9, 6));
}
}
Passage des arguments
Java ne connaît qu'un seul mode de passage : la copie. Mais copier une référence, c'est copier l'adresse d'un objet : la copie et l'original désignent le même objet. D'où le résultat de l'exemple de la deuxième carte : a n'a pas changé, t[0] a été modifié (le tableau est partagé), et t.length vaut toujours 3 (la réaffectation t = new int[3] ne concernait que la copie locale).
Renvoyer plusieurs valeurs
Une méthode ne renvoie qu'une valeur. Pour en rendre plusieurs, on renvoie un tableau (ou, plus proprement, un objet : voir POO).
public class Extremes {
static int[] extremes(int[] t) {
int min = t[0];
int max = t[0];
for (int x : t) {
if (x < min) min = x;
if (x > max) max = x;
}
return new int[] {min, max};
}
public static void main(String[] args) {
int[] notes = {12, 7, 15, 9};
int[] res = extremes(notes);
System.out.println("min = " + res[0] + ", max = " + res[1]);
}
}
Affichagemin = 7, max = 15
Portée des variables
- Une variable locale (dans une méthode, un bloc ou un
for) n'existe que dans ce bloc.
- Un paramètre vit le temps de l'appel.
- Une variable
static déclarée dans la classe (hors de toute méthode) est partagée par tous les appels et garde sa valeur entre eux.
public class Appels {
static int appels = 0; // partagée par toute la classe
static int suivant() {
appels++;
return appels;
}
public static void main(String[] args) {
System.out.println(suivant());
System.out.println(suivant());
System.out.println(suivant());
}
}
Récursivité
Une méthode récursive s'appelle elle-même. Il lui faut un cas de base qui arrête la récursion et un appel sur un cas plus petit. Sans cas de base, les appels s'empilent jusqu'à une StackOverflowError.
public class Factorielle {
static long fact(int n) {
if (n <= 1) {
return 1; // cas de base
}
return n * fact(n - 1); // appel sur un cas plus petit
}
public static void main(String[] args) {
System.out.println(fact(5));
System.out.println(fact(20));
}
}
Affichage120
2432902008176640000
Au-delà de 20!, un long déborde sans prévenir (complément à deux, voir Entiers signés).
Documenter avec Javadoc
Un commentaire /** … */ placé juste avant une méthode, avec @param et @return, est lu par les éditeurs (info-bulle) et par l'outil javadoc.
/**
* Calcule la moyenne de deux notes.
*
* @param a première note
* @param b deuxième note
* @return la moyenne, entre a et b
*/
static double moyenne(double a, double b) {
return (a + b) / 2;
}