¿Qué significan los 3 puntos en el siguiente método?
public void myMethod(String... strings){
// method body
}
fuente
¿Qué significan los 3 puntos en el siguiente método?
public void myMethod(String... strings){
// method body
}
Significa que se pueden pasar cero o más objetos String (o una matriz de ellos) como argumento (s) para ese método.
Consulte la sección "Número arbitrario de argumentos" aquí: http://java.sun.com/docs/books/tutorial/java/javaOO/arguments.html#varargs
En su ejemplo, podría llamarlo como cualquiera de los siguientes:
myMethod(); // Likely useless, but possible
myMethod("one", "two", "three");
myMethod("solo");
myMethod(new String[]{"a", "b", "c"});
Nota importante: Los argumentos pasados de esta manera siempre son una matriz, incluso si solo hay uno. Asegúrese de tratarlo de esa manera en el cuerpo del método.
Nota importante 2: El argumento que obtiene el ...
debe ser el último en la firma del método. Entonces, myMethod(int i, String... strings)
está bien, pero myMethod(String... strings, int i)
no está bien.
Gracias a Vash por las aclaraciones en su comentario.
someMethod(new SomeType[] { })
. Eso sería un truco, ¿no?Esa característica se llama varargs , y es una característica introducida en Java 5. Significa que la función puede recibir múltiples
String
argumentos:Luego, puede usar la
String
var como una matriz:Esta respuesta se basa en gran medida en la de kiswa y Lorenzo ... y también en el comentario de Graphain.
fuente
Es Varargs :)
La abreviatura varargs para argumentos de longitud variable es una característica que permite que el método acepte un número variable de argumentos (cero o más). Con varargs se ha vuelto simple crear métodos que necesitan tomar un número variable de argumentos. La característica de argumento variable se ha agregado en Java 5.
Sintaxis de varargs
Un vararg está segmentado por tres puntos suspensivos (tres puntos) después del tipo de datos, su forma general es
Necesidad de varargs
Antes de Java 5, en caso de que fuera necesario un número variable de argumentos, había dos formas de manejarlo.
Si el número máximo de argumentos que un método puede tomar era pequeño y conocido, entonces podrían crearse versiones sobrecargadas del método. Si el número máximo de argumentos que un método podría tomar era grande o desconocido, entonces el enfoque consistía en colocar esos argumentos en una matriz y pasarlos a un método que tomara la matriz como parámetro. Estos 2 enfoques eran propensos a errores, construyendo una matriz de parámetros cada vez y difíciles de mantener, ya que la adición de nuevos argumentos puede resultar en escribir un nuevo método sobrecargado.
Ventajas de varargs
Ofrece una opción mucho más simple. Menos código ya que no es necesario escribir métodos sobrecargados.
Ejemplo de varargs
Del programa se puede ver que la longitud se usa aquí para encontrar el número de argumentos pasados al método. Es posible porque los varargs se pasan implícitamente como una matriz. Los argumentos que se pasan como varargs se almacenan en una matriz que se denomina por el nombre dado a varargs. En este programa, el nombre de la matriz es valores. También tenga en cuenta que el método se llama con un número diferente de argumentos, primero con cuatro argumentos, luego con tres argumentos y luego con cero argumentos. Todas estas llamadas son manejadas por el mismo método que toma varargs.
Restricción con varargs
Es posible tener otros parámetros con el parámetro varargs en un método, sin embargo, en ese caso, el parámetro varargs debe ser el último parámetro declarado por el método.
Otra restricción con varargs es que solo debe haber un parámetro varargs.
Sobrecarga de métodos varargs
Es posible sobrecargar un método que toma el parámetro varargs. El método Varargs se puede sobrecargar por:
Los tipos de su parámetro vararg pueden ser diferentes. Al agregar otros parámetros. Ejemplo de sobrecarga del método varargs
Varargs y sobrecarga de ambigüedad
En algunos casos, la llamada puede ser ambigua mientras hemos sobrecargado el método varargs. Veamos un ejemplo.
En este programa, cuando hacemos una llamada al método displayData () sin ningún parámetro, arroja un error, porque el compilador no está seguro de si esta llamada al método es para
displayData(String ... values)
odisplayData(int ... values)
De la misma manera, si tenemos métodos sobrecargados donde uno tiene el
vararg
método de un tipo y otro método tiene un parámetro y unvararg
parámetro del mismo tipo, entonces también tenemos la ambigüedad, como Exp,displayData(int ... values)
ydisplayData(int a, int ... values)
Estos dos métodos sobrecargados siempre tendrán ambigüedad.
fuente
Esta es la forma Java de pasar varargs (argumentos de números variables).
Si está familiarizado con C, esto es similar a la
...
sintaxis utilizada en laprintf
función:pero de forma segura: cada argumento debe cumplir con el tipo especificado (en su muestra, deberían ser todos
String
).Esta es una muestra simple de cómo puede usar varargs :
El
...
argumento es en realidad una matriz, por lo que podría pasar aString[]
como parámetro.fuente
Podría decirse que es un ejemplo de azúcar sintáctico, ya que de todos modos se implementa como una matriz (lo que no significa que sea inútil): prefiero pasar una matriz para mantenerla clara y también declarar métodos con matrices de un tipo dado. Sin embargo, es más una opinión que una respuesta.
fuente
También para arrojar algo de luz, es importante saber que los parámetros var-arg están limitados a uno y no puede tener varios parámetros de var-art. Por ejemplo, esto es ilegal:
fuente
Solo piense en ella como la palabra clave
params
en C #, si viene de ese contexto :)fuente
Una forma muy común de ver un ejemplo claro del uso de los tres puntos está presente en uno de los métodos más famosos en Android AsyncTask (que hoy no se usa demasiado debido a RXJAVA, sin mencionar los componentes de Google Architecture), puedes encontrar miles de ejemplos buscando este término, y la mejor manera de entender y nunca más olvidar el significado de los tres puntos es que expresan una ... duda ... al igual que en el lenguaje común. Es decir, no está claro el número de parámetros que deben pasarse, podría ser 0, podría ser 1 podría ser más (una matriz) ...
fuente
String...
es lo mismo queString[]
fuente
String...
es lo mismo queString[]
, ¿no podrías decir eso?String[]
requiere un argumento (al menos una matriz vacía) mientrasString...
que no (ver la respuesta anterior).Además de las otras respuestas bien escritas, una ventaja
varagrs
que encontré útil es que, cuando llamo a un método con una matriz como tipo de parámetro, me quita el dolor de crear una matriz; agregue elementos y luego envíelo. En cambio, puedo llamar al método con todos los valores que quiera; de cero a muchos.fuente
Ejemplo 1:
Ejemplo 2
fuente
Sintaxis: (Triple punto ...) -> Significa que podemos agregar cero o más objetos pasados en un argumento o pasar una matriz de objetos tipo.
Definición: 1) El argumento Objeto ... es solo una referencia a una matriz de Objetos.
2) ('Cadena []' o Cadena ...) Puede manejar cualquier número de objetos de cadena. Internamente utiliza una matriz de objetos de tipo de referencia.
3) Si desea llamar al método con un solo argumento y resulta ser una matriz, debe envolverlo explícitamente en
Aplicación: Se utiliza principalmente cuando el número de argumentos es dinámico (número de argumentos conocidos en tiempo de ejecución) y en la anulación. Regla general : en el método podemos pasar cualquier tipo y cualquier número de argumentos. No podemos agregar argumentos de objeto (...) antes de cualquier argumento específico. es decir
fuente