1. Introduzione
Cominciamo con una domanda: perché un metodo dovrebbe restituire qualcosa? Perché non si può semplicemente fare tutto dentro il metodo e stampare il risultato a schermo?
Il punto è che spesso abbiamo bisogno non solo di eseguire un’azione, ma di ottenere un risultato che tornerà utile in altre parti del programma. Per esempio:
- Un metodo calcola la somma di due numeri e la restituisce, così possiamo usare il risultato per calcoli successivi.
- Un metodo determina se un numero è pari e restituisce true o false, in modo da poter prendere una decisione.
- Un metodo restituisce una stringa di saluto per l’utente, e sta a noi decidere dove passarla — stamparla a schermo, salvarla su file, inviarla in rete.
Se i metodi stampassero sempre e solo il risultato, il nostro programma sarebbe vincolato a un unico scenario e riutilizzare la logica sarebbe difficile. Un valore restituito rende i metodi flessibili e universali.
Analogia
Immagina un distributore di caffè. Inserisci i soldi, premi il pulsante — e ottieni il caffè. Se la macchina dicesse solo a voce alta “Il caffè è pronto!” (ma non erogasse il caffè), non saresti contento. Così è con i metodi: a volte non basta sentire “Fatto!”, vogliamo ottenere il risultato.
2. Tipo del valore restituito: cosa può restituire un metodo
In Java, quando dichiari un metodo, specifichi il tipo del valore restituito — può essere qualunque tipo: int, double, String, boolean, un array, perfino un oggetto di una tua classe. Se il metodo non restituisce nulla — si scrive void.
Sintassi:
tip_vozvrashchayemogo_znacheniya imyaMetoda(parametry)
{
// corpo del metodo
}
Esempi:
int sum(int a, int b)
{
// restituisce int
}
String getGreeting(String name)
{
// restituisce String
}
boolean isEven(int number)
{
// restituisce boolean
}
void printHello()
{
// non restituisce nulla — esegue solo un'azione
}
Importante! Il tipo del valore restituito è una “promessa” del metodo: è obbligato a restituire un valore di quel tipo. Se prometti di restituire un int, ma restituisci una String — il compilatore si “arrabbierà” e non ti farà compilare il programma.
3. Operatore return: come restituire un valore da un metodo
Per consegnare davvero il risultato del lavoro del metodo “all’esterno”, si usa l’operatore return. Questa parola dice: “Ecco il risultato — e con questo il mio lavoro è finito”.
int sum(int a, int b)
{
int result = a + b;
return result; // restituiamo il risultato
}
Si può anche più corto:
int sum(int a, int b)
{
return a + b;
}
Quando il metodo raggiunge la riga return, termina l’esecuzione, restituisce il valore indicato e lo passa al punto da cui è stato chiamato.
Importante: il tipo del valore dopo return deve coincidere con il tipo dichiarato del metodo.
4. Uso del valore restituito: dove lo metto?
Quando un metodo restituisce un valore, puoi:
- Salvarlo in una variabile.
- Usarlo direttamente in un’espressione.
- Passarlo a un altro metodo.
int result = sum(5, 7); // salviamo in una variabile
System.out.println(result); // stampiamo il risultato
System.out.println(sum(10, 20)); // stampiamo subito il risultato
if (isEven(42))
{
System.out.println("Il numero è pari!");
}
Esempio: un metodo che restituisce una stringa
String getGreeting(String name)
{
return "Ciao, " + name + "!";
}
// Utilizzo:
String greeting = getGreeting("Alice");
System.out.println(greeting); // Ciao, Alice!
5. Pratica: esempi di metodi con valore restituito
Metodo che restituisce il massimo di due numeri
int max(int a, int b)
{
if (a > b)
{
return a;
}
else
{
return b;
}
}
Ancora più corto, se conosci già l’operatore ternario:
int max(int a, int b)
{
return (a > b) ? a : b;
}
Utilizzo:
int maximum = max(10, 25);
System.out.println("Massimo: " + maximum); // Massimo: 25
Metodo che restituisce true se il numero è pari
boolean isEven(int number)
{
return number % 2 == 0;
}
Utilizzo:
if (isEven(18))
{
System.out.println("Il numero è pari!");
}
else
{
System.out.println("Il numero è dispari!");
}
Metodo che restituisce la somma degli elementi di un array
int sumArray(int[] arr)
{
int sum = 0;
for (int i = 0; i < arr.length; i++)
{
sum += arr[i];
}
return sum;
}
Utilizzo:
int[] grades = {5, 4, 3, 5, 4};
int total = sumArray(grades);
System.out.println("Somma dei voti: " + total);
6. Cosa succede quando si chiama un metodo con return
Quando chiami un metodo con valore restituito, l’esecuzione del programma “entra” nel metodo, ne esegue il codice, arriva a return, restituisce il valore — e lo sostituisce al posto della chiamata.
Schema:
int a = 2;
int b = 3;
int c = sum(a, b); // qui si chiama sum(2, 3), viene restituito 5, c diventa uguale a 5
Diagramma di flusso
graph TD
A["main"] --> B["sum(a, b)"]
B --> C[calcoli]
C --> D[return result]
D -->|il risultato viene restituito| A
7. Dettagli utili
return termina l’esecuzione del metodo
Non appena in un metodo si incontra return, l’esecuzione del metodo si interrompe immediatamente. Tutto ciò che è scritto dopo — non viene eseguito.
int test()
{
return 42;
System.out.println("Questo non verrà stampato"); // unreachable
}
return in un metodo di tipo void
In un metodo void (che non restituisce nulla) si può usare return senza valore — solo per terminare anticipatamente l’esecuzione del metodo, per esempio al verificarsi di una certa condizione.
void printPositive(int number)
{
if (number <= 0)
{
System.out.println("Il numero non è positivo!");
return; // usciamo semplicemente dal metodo
}
System.out.println("Numero: " + number);
}
8. Errori tipici nell’uso di return
Errore n. 1: non tutti i percorsi restituiscono un valore
int getSign(int number)
{
if (number > 0)
{
return 1;
}
// E se number <= 0? Nessun return!
}
// Errore: non tutti i rami del codice restituiscono un valore
Come risolvere: prevedere sempre return in tutti i percorsi di esecuzione.
int getSign(int number)
{
if (number > 0)
{
return 1;
}
else if (number < 0)
{
return -1;
}
else
{
return 0;
}
}
Errore n. 2: tipo del valore restituito non corrispondente
int getNumber()
{
return "42"; // Errore! Atteso int, non String
}
Errore n. 3: return dopo return
int test()
{
return 5;
System.out.println("Questo non verrà eseguito"); // unreachable statement
}
Errore n. 4: return con un’espressione in un metodo void
void printSomething()
{
return 42; // Errore! Un metodo void non può restituire un valore
}
Errore n. 5: ignorare il valore restituito
sum(10, 20); // e basta? Il risultato è andato perso!
Se non usi il valore restituito, va semplicemente perso. Non dimenticare di salvarlo o passarlo più avanti nel codice!
Errore n. 6: aspettarsi che return stampi qualcosa
int result = sum(2, 3);
// return non stampa nulla!
// È necessario stamparlo esplicitamente:
System.out.println(result);
GO TO FULL VERSION