HOWTO · Java

Parametri predefiniti Java

Questo articolo spiega se Java supporta i parametri predefiniti.

In questa pagina

Java non supporta valori predefiniti per i parametri nelle dichiarazioni dei metodi. Ogni chiamata deve fornire un argomento per ciascun parametro fisso; un parametro varargs può ricevere zero o più argomenti. Il compilatore non inserisce un valore quando viene omesso un argomento per un parametro fisso. Per offrire comportamenti facoltativi, si possono definire overload, accettare con varargs un numero variabile di valori dello stesso tipo oppure rappresentare esplicitamente l’assenza nella propria API. Queste soluzioni rispondono a esigenze diverse: scegli in base al fatto che chi chiama il metodo abbia bisogno di poche alternative fisse, di un elenco di lunghezza variabile o di distinguere chiaramente tra «non fornito» e un valore fornito.

Java supporta i valori predefiniti per i parametri?

No. La firma di un metodo Java dichiara i parametri fissi che ogni chiamata deve fornire. Per esempio, non è possibile chiamare un metodo dichiarato come send(String recipient, String subject) passando soltanto il destinatario. Java non deduce l’oggetto né applica un valore predefinito dichiarato nella firma. Il corpo del metodo può scegliere un valore alternativo dopo aver ricevuto un argomento, ma si tratta di logica dell’applicazione, non di un parametro predefinito previsto dal linguaggio.

Usa il sovraccarico di metodi per pochi argomenti facoltativi

Il sovraccarico di metodi offre a chi chiama il metodo alcune forme di chiamata esplicite. Un overload con meno parametri può passare un valore alternativo al metodo completo. È una soluzione adatta quando le alternative più comuni sono poche, perché il valore usato resta visibile nel codice. Nell’esempio seguente, l’overload con un solo argomento fornisce "Hello" come valore predefinito del saluto.

Esegui questo esempio:

Il codice e le etichette o gli output visibili in questa sezione restano in inglese.

public class GreetingExample {
    static String greet(String name) {
        return greet(name, "Hello");
    }

    static String greet(String name, String greeting) {
        return greeting + ", " + name + "!";
    }

    public static void main(String[] args) {
        System.out.println(greet("Maya"));
        System.out.println(greet("Maya", "Welcome"));
    }
}
Hello, Maya!
Welcome, Maya!

L’overload fornisce esplicitamente il valore alternativo; il compilatore no. Gli overload diventano macchinosi quando aumentano gli argomenti facoltativi. Se due parametri facoltativi hanno lo stesso tipo e chi chiama il metodo può omettere l’uno o l’altro indipendentemente, i tipi dei parametri nella firma non permettono di capire quale sia stato omesso. Gestire molte combinazioni può quindi richiedere numerose firme distinte. Se servono molte combinazioni, usa metodi con nomi chiari oppure un oggetto che raccolga le opzioni.

Usa varargs per un numero variabile di argomenti dello stesso tipo

Un parametro varargs, scritto come Type... values, permette a un metodo di accettare zero o più argomenti di quel tipo. All’interno del metodo, Java li rende disponibili come array. Varargs è utile quando il numero di valori varia davvero; non fornisce un valore alternativo per un parametro fisso omesso. Il metodo può stabilire che cosa significhino zero valori, come nell’esempio, che restituisce zero quando l’elenco è vuoto.

Il codice e le etichette o gli output visibili in questa sezione restano in inglese.

public class SumExample {
    static int sum(int... values) {
        int total = 0;
        for (int value : values) {
            total += value;
        }
        return total;
    }

    public static void main(String[] args) {
        System.out.println(sum());
        System.out.println(sum(4, 7, 9));
    }
}
0
20

Restituire zero quando non ci sono valori è la regola scelta dal metodo per la somma. Non è un argomento predefinito fornito da Java. Un metodo può avere un solo parametro varargs, che deve essere l’ultimo; gli eventuali parametri fissi devono quindi precederlo.

Scegli un valore sentinella o un wrapper quando l’assenza è diversa da un valore

Una stringa vuota ("") è una stringa reale che non contiene caratteri. null è un valore di riferimento distinto, mentre un argomento omesso non viene passato affatto. Né il testo vuoto né null vengono sostituiti automaticamente a un argomento mancante. Usa una stringa vuota quando quello è il valore desiderato; usa null solo se la tua API definisce che cosa significa la sua assenza e chi la chiama può gestirla in sicurezza.

Quando occorre distinguere «non fornito» da ogni valore valido, rappresenta esplicitamente questa condizione. Per un riferimento nullable può bastare una convenzione documentata che usa null, ma non consente di esprimere l’assenza per i parametri primitivi e può essere facile da usare in modo scorretto. Un wrapper come Optional<String> può rendere esplicita la presenza di un valore di riferimento; per più impostazioni facoltative, spesso è più chiaro usare una classe di opzioni o un builder. In ogni caso, chi chiama il metodo deve comunque passare il wrapper o l’oggetto delle opzioni: queste soluzioni rappresentano l’assenza all’interno dell’API, ma non aggiungono parametri predefiniti nativi a Java.