HOWTO · Java

Parámetros por defecto de Java

Este artículo presenta si Java admite parámetros predeterminados.

En esta página

Java no admite valores de parámetros predeterminados en las declaraciones de métodos. Cada llamada debe proporcionar un argumento para cada parámetro fijo; un parámetro varargs puede recibir cero o más argumentos. El compilador no inserta un valor cuando se omite un argumento fijo. Para ofrecer comportamientos opcionales, define sobrecargas, acepta una cantidad variable de valores del mismo tipo mediante varargs o representa explícitamente la ausencia en tu API. Estos patrones resuelven problemas distintos: elige según si quienes llaman necesitan unas pocas opciones fijas, una lista de longitud variable o distinguir entre «no proporcionado» y un valor proporcionado.

¿Admite Java valores de parámetros predeterminados?

No. La firma de un método de Java declara los parámetros fijos que deben proporcionarse en cada llamada. Por ejemplo, no se puede llamar a un método declarado como send(String recipient, String subject) pasando solo un destinatario. Java no deduce el asunto ni aplica un valor predeterminado a partir de la declaración. El cuerpo de un método puede elegir un valor alternativo después de recibir un argumento, pero eso es lógica de la aplicación, no un parámetro predeterminado propio del lenguaje.

Usa la sobrecarga de métodos para unos pocos argumentos opcionales

La sobrecarga de métodos ofrece a quienes llaman unas pocas formas explícitas de invocar un método. Una sobrecarga con menos parámetros puede pasar un valor alternativo al método completo. Funciona bien cuando solo hay unas pocas alternativas habituales y el valor alternativo queda visible en el código. En el siguiente ejemplo, la sobrecarga de un argumento asigna "Hello" como saludo predeterminado.

Ejecuta este ejemplo:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

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!

La sobrecarga proporciona explícitamente el valor alternativo; el compilador no lo hace. Las sobrecargas se vuelven engorrosas cuando aumenta la cantidad de argumentos opcionales. Si dos parámetros opcionales tienen el mismo tipo y quienes llaman pueden omitir cualquiera de ellos por separado, los tipos de los parámetros de una firma de método no permiten saber cuál se omitió. Por eso, admitir muchas combinaciones puede requerir numerosas firmas distintas. Si quienes llaman necesitan muchas combinaciones, usa métodos con nombres claros o un objeto de opciones.

Usa varargs para una cantidad variable de argumentos del mismo tipo

Un parámetro varargs, escrito como Type... values, permite que un método acepte cero o más argumentos de ese tipo. Dentro del método, Java los expone como una matriz. varargs resulta útil cuando la cantidad de valores realmente varía; no establece un valor alternativo para un parámetro fijo omitido. El método puede decidir qué significan cero valores, como en este ejemplo, que devuelve cero cuando la lista está vacía.

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

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

Devolver cero cuando no hay valores es la regla de suma elegida por el método. Java no proporciona ese valor como argumento predeterminado. Un método solo puede tener un parámetro varargs, y este debe ser el último; por tanto, los parámetros fijos deben aparecer antes.

Elige un valor centinela o un contenedor cuando la omisión sea distinta de un valor

Una cadena vacía ("") es una cadena real que no contiene caracteres. null es un valor de referencia distinto, y un argumento omitido no se pasa en absoluto. Ni el texto vacío ni null se sustituyen automáticamente por un argumento ausente. Usa una cadena vacía cuando ese sea el valor deseado; usa null solo si tu API define qué significa su ausencia y quienes llaman pueden gestionarla de forma segura.

Cuando quienes llaman deben distinguir «no proporcionado» de cualquier valor válido, representa ese estado explícitamente. Para una referencia anulable, puede bastar una convención documentada para null, pero no permite expresar la ausencia en parámetros primitivos y es fácil usarla mal. Un contenedor como Optional<String> puede hacer explícita la presencia de un valor de referencia, mientras que una clase de opciones o un creador suele ser más claro cuando hay varios ajustes opcionales. En cualquier caso, quien llama debe pasar el contenedor o el objeto de opciones: estas alternativas modelan la ausencia dentro de la API, pero no añaden parámetros predeterminados nativos a Java.