java - test - uso de varargs
¿Por qué Java no usa una lista de argumentos de longitud variable? (8)
Tengo una pregunta sobre la sintaxis de la declaración main
Java:
public static void main (String[] args)
Dado que puede pasar un número variable de cadenas al invocar la función principal, ¿no debería ser esto una lista de argumentos de longitud variable en lugar de una matriz? ¿Por qué funcionaría una invocación de línea de comandos de este método con una lista de parámetros de cadena? (A menos que haya un procesamiento detrás de las cámaras que genere una matriz con la lista de cadenas y luego la pase al método principal ...) ¿No debería la declaración principal ser algo más como esto ...? -
public static void main(String... args)
¿No debería ser la declaración principal algo más como esto ...?
public static void main(String... args)
En realidad, eso se podría hacer sin problema.
Fue String [] args
antes de que se introdujeran var args, pero hoy en día ambos funcionan.
¿Por qué te importa? Nadie llama el método principal a mano. Es interno a Java.
EDITAR: Supongo que no importa ahora, ya que puede definir el método principal como:
public static void main(String... args);
Mi punto sigue siendo válido ya que nadie llama principal explícitamente.
Bueno, la segunda sintaxis es solo una variación de 1st y sí, estaría bien, pero en este momento no está integrada en Java
El método principal fue diseñado para Java 1.0.
La sintaxis "..." se introdujo en Java 1.5
Se implementa a través de una matriz del tipo que definió (supongo, pero ... si los códigos Java 1.4 y 1.5 byte son compatibles, por lo que deben implementarse con matrices).
La sintaxis principal de java es anterior a varargs, que solo se introdujeron en java 1.5.
No hay un método principal de Java , de hecho, puede declarar la matriz como vararg en su método principal :
public static void main(String... args) { System.out.println("Hi!"); }
Puedes declarar main de cualquier manera, y funciona bien. No hay problemas de "compatibilidad hacia atrás" o "adaptación". Sin embargo, a los lectores de su código les puede distraer y es poco probable que mejore su programa de alguna manera.
La sección 8.4.1 de la Especificación del lenguaje Java (tercera edición) dice que "Si el último parámetro formal es un parámetro de aridad variable de tipo T , se considera que define un parámetro formal de tipo T [] ".
La especificación de cómo se inicia un programa Java está en JLS 12.2 , que hace referencia al capítulo 5 de la especificación de VM. La sección 5.2 de la especificación de la máquina virtual dice que la máquina virtual invoca un método de clase pública " void main(String[])
". Dado que la especificación de VM no tiene un concepto de aridad variable, un principal que se declaró usando " ...
" cumple con el requisito.
main(String... args)
y main (String[] args)
son efectivamente lo mismo: Lo que estás obteniendo es una matriz String
. El varargs es solo azúcar sintáctica para la persona que llama.
Supongo que como nunca llama a main()
desde el código, no se modificó cuando se introdujeron varargs.
Edición : En realidad, rasca esa última frase. main(String... args)
es una sintaxis perfectamente válida, por supuesto. Los dos estilos son completamente intercambiables. Esto funciona bien
public class Test {
public static void main(String... args) {
System.out.println("Hello World");
}
}