2010-10-18 11 views

Respuesta

10

Esto se llama Variadic function (página wiki con ejemplos en muchos languges).

En la programación informática, una función variadic es una función de indefinida aridad, es decir, uno que acepta un número variable de argumentos. Soporte para funciones variadic difiere ampliamente entre los lenguajes de programación. Hay muchas operaciones matemáticas y lógicas que se encuentran naturalmente como funciones variadas. Por ejemplo, la suma de números o la concatenación de cadenas u otras secuencias son operaciones que pueden aplicarse lógicamente a cualquier número de operandos . Se ha implementado otra operación que tiene como una función variad en muchos idiomas con formato de salida . La función C printf y el formato de función Common Lisp son dos de estos ejemplos. Ambos toman un argumento que especifica el formato de la salida, y se formatea cualquier número de argumentos que proporcionan los valores a . Las funciones variables pueden exponer problemas de seguridad tipo en algunos idiomas . Por ejemplo, printf de C, si se usa de forma incauta, puede dar lugar a una clase de agujeros de seguridad conocidos como ataques de cadena de formato .El ataque es posible porque el soporte de idioma para funciones variadic no es type-safe; permite que la función intente extraer más argumentos de la pila que se colocaron allí - corrompiendo la pila y dando lugar a un comportamiento inesperado . Variadic funcionalidad puede considerarse complementaria a la función de aplicar, que tiene una función y una lista/secuencia/matriz como argumentos y entonces llama a la función una vez, con los argumentos siendo los elementos de la lista .

Una de mayo favorito personal características que no se utilizan en Java. Básicamente es una matriz de referencia construida a partir de elementos. Una de las mejores formas de usarlo es en el constructor de clase, o método en el que necesita encontrar constantemente un valor como máximo de 2, 3, 4, 5 elementos de entrada.

Un ejemplo es cuando construí un genérico binary tree node, para tareas de codificación, lo usé en el constructor. Esto me permitió simplemente agregar elementos al árbol y distribuirlos.

A continuación se crea el tipo de árbol binario de tipo cadena, con raíz "Red" y 2 ramas "Blue" y "Green".

new MBTN<String>("Red", "Blue", "Green"). 

¿Podrían pensar cuáles serían las alternativas? D Ni siquiera puede hacer simplemente un conjunto genérico de elementos, por lo que esto se extendería como el infierno. Definitivamente no es inútil.

+0

Gracias a todos. Entiendo perfectamente. Supongo que sin saber esto, solo habría usado un String [] en su lugar. Pero ahora puedo leer el código que otros escriben. – Jim

+0

"No se puede simplemente hacer una matriz genérica de elementos" Luego recibirá una advertencia al usar varargs de esta manera, porque también intentará crear una matriz genérica detrás de las escenas, pero no puede – newacct

+0

Debo mencionar, ese ** nuevo MBTN (Arrays.asList ("Rojo", "Azul", "Verde")); ** se consideraría mejor. – Margus

14

Se llama varargs. Este hecho debería producir better Google results.

+0

No es tan fácil de buscar si no sabes cómo se llama ... –

+5

@Carlos: uhm, es exactamente por eso que respondí cómo se llama. – BalusC

0

Es un método Java que tuvo un número variable de parámetros arbitrarios

1

Son parámetros de longitud variable.

Aquí es un enlace con un example.

3

Como se mencionó @BalusC, que es un parámetro varags. Esto significa que puede pasar una cantidad variable de argumentos a ese método.

Así, por un método definido como

public void foo(String...strings) { } 

Las siguientes invocaciones son legales:

foo(); 
foo("one param"); 
foo("one", "two", "three"); 
0

significa "número arbitrario de argumentos" que significa que puede pasar un número indeterminado de parámetros en el método ..

ver

http://download.oracle.com/javase/tutorial/java/javaOO/arguments.html Busque el "número arbitrario de argumentos" sección

public Polygon polygonFrom(Point... corners) { 
    int numberOfSides = corners.length; 
    double squareOfSide1, lengthOfSide1; 
    squareOfSide1 = (corners[1].x - corners[0].x)*(corners[1].x - corners[0].x) 
      + (corners[1].y - corners[0].y)*(corners[1].y - corners[0].y) ; 
    lengthOfSide1 = Math.sqrt(squareOfSide1); 
    // more method body code follows that creates 
    // and returns a polygon connecting the Points 
} 
1

Como se ha mencionado por todo el mundo ... argumentos variable (o varargs) le permite hacer esto ....

//Method we're using for varargs 
public void doSomething(String... datas) { 
    if (datas == null || datas.length == 0) { 
     System.out.println("We got nothing"); 
    } else { 
     for (String data: datas) { 
      System.out.println(data); 
     } 
    } 
} 

Por lo tanto, todas estas llamadas se mencionan a continuación son válidos ....

String d[] = {"1", "2", "3"}; 
doSomething(d); //An array of String, as long as the type is exactly as the varargs type. 

//OR 
doSomething("1", "2", "3", "4"); //I can add "infinitely" many arguments as the JVM can allocate me.... 

//OR 
doSomething("1"); //Exactly 1; 

Internally varargs es "esencialmente" una matriz de referencia de su tipo declarado.

6

Son los "argumentos variables" o varargs (para abreviar).

Básicamente se permite el paso de un número indeterminado de cadenas, por lo que la firma del método

public void printStuff(String...messages) 

efectivamente puede manejar las llamadas siguientes

printStuff("hi"); 
printStuff("hi", "bye"); 
printStuff("Hello", "How are you?", "I'm doing fine.", "See you later"); 

se puede considerar la eficacia de este tipo de autoboxing. El argumento printStuff se puede ver como una matriz, por lo que printStuff(String...messages) se maneja conceptualmente como printStuff(String[] messages). Satisfechas con las llamadas que actúa por encima de eficacia como

printStuff(new String[] {"hi"}); 
printStuff(new String[] {"hi", "bye"}); 
printStuff(new String[] {"Hello", "How are you?", "I'm doing fine.", "See you later"}); 

Para acceder a los mensajes internos, se utiliza List primitivas típicas de manipulación.Algo así como

... 
if (messages != null) { 
    for (String message : messages) { 
    System.out.println(message); 
    } 
} 
... 

Que no hay necesidad de crear matrices en realidad es un poco de azúcar sintáctico añadido a Java con el advenimiento de boxeo de automóviles.

+0

Hola, estoy pasando solo un parámetro, cómo acceder a ese. –

+0

@Sridhar Al pasar solo un parámetro, se convierte en el primer (y único) elemento de la matriz. –

+0

Gracias por responder lo tengo. podemos obtener el primer argumento como mensajes [0]. –

Cuestiones relacionadas