¿Main es un identificador Java válido?


Uno de mis hijos está tomando Java en la escuela secundaria y tenía esto en una de sus pruebas:

Cuál de los siguientes es un identificador válido en Java?

A. 123java
b. main
c. java1234
d. {abce
e. )whoot

Él respondió b y se equivocó.

Miré la pregunta y argumenté que main es un identificador válido y que debería haber sido correcto.

Echamos un vistazo en el Java spec para identificadores y reforzó ese punto. También escribimos un programa de muestra que tenía una variable llamada main, así como un método. Creó una refutación escrita que incluía la referencia de la documentación de Java, el programa de prueba y el profesor lo ignoró y dice que la respuesta sigue siendo incorrecta.

Es main un identificador válido?

Author: Andrew Tobilko, 2018-09-10

14 answers

public class J {
    public static void main(String[] args)
    {
        String main = "The character sequence \"main\" is an identifier, not a keyword or reserved word.";
        System.out.println(main);
    }
}

Esto compila, y cuando se ejecuta, emite esta salida:

The character sequence "main" is an identifier, not a keyword or reserved word.

La secuencia de caracteres main es un identificador, no una palabra clave o palabra reservada.

La sección relevante de la JLS es 3.8:

Un identificador es una secuencia de longitud ilimitada de letras Java y dígitos Java, el primero de los cuales debe ser una letra Java.

Identificador:

Identificadorchars pero no una palabra clave o BooleanLiteral o nulliteral

Identificadorchars:

JavaLetter {JavaLetterOrDigit}

JavaLetter:

Cualquier carácter Unicode que sea una "letra Java"

JavaLetterOrDigit:

Cualquier carácter Unicode que sea una "letra o dígito Java"

La secuencia de caracteres main se ajusta a la descripción anterior y no está en la lista de palabras clave en la Sección 3.9.

(La secuencia de caracteres java1234 es también un identificador, por las mismas razones.)

 237
Author: rgettman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-11 04:58:26

main es un identificador java válido, y el profesor está equivocado.

La documentación relevante está en la Especificación del lenguaje Java, aquí:

Capítulo 3. "Estructura léxica", sección 3.8. "Identificadores":

Https://docs.oracle.com/javase/specs/jls/se10/html/jls-3.html#jls-3.8

Dice:

Un identificador es una secuencia de longitud ilimitada de letras Java y dígitos Java, el primero de los cuales debe ser una letra Java... Identificador no puede tener la misma ortografía (secuencia de caracteres Unicode) que una palabra clave (§3.9), literal booleano (§3.10.3), o el literal nulo (§3.10.7), o ocurre un error en tiempo de compilación.

Lo que significa que puede probar que es un identificador válido usándolo como identificador y observando que no se produce ningún error en tiempo de compilación.

 83
Author: Mike Nakis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-14 17:37:28

Como dicen las otras respuestas

main es un identificador Java válido , así como java1234.

Supongo que la confusión proviene del hecho de que el método main(String[]) se utiliza a menudo como punto de entrada por la JVM1. Sin embargo, eso no significa que el token main en sí no pueda usarse como identificador2.

Las especificaciones lo dicen, y las siguientes declaraciones también son válidas:

  • Un campo:

    private int main;
    
  • A local variable:

    String main = "";
    
  • Un método:

    private void main() { ... }
    
  • Una clase (aunque se desaconseja un nombre de clase que comience con minúsculas):

    public class main { ... }
    
  • Un paquete:

    package main;
    

1: Como se señaló en los comentarios, la especificación de la JVM en sí no exige ningún método en particular como punto de entrada, pero la herramienta ampliamente utilizada java a menudo utiliza dicho método como punto de entrada.
2: En general, evitaría crear una método distinto de main(String[]).

 65
Author: MC Emperor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-13 18:43:10

Esto compila bien en Java 1.8...

public class main {

    public String main = "main"; 

    public void main(String main) {
        System.out.println("This object is an instance of the class " + this.getClass().getCanonicalName());
        System.out.println("The value of the argument \"main\" for this call to the method \"main(String main)\" is " + main);
        System.out.println("The value of the field \"main\" is " + this.main);
    }

    public static void main(String[] args) {
        main main = new main();
        main.main(main.main + main.main);
    }
}

...y cuando se ejecuta produce la salida:

This object is an instance of the class main
The value of the argument "main" for this call to the method "main(String main)" is mainmain
The value of the field "main" is main
 54
Author: MichaelK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-11 14:24:07

¿Cómo main no se puede utilizar como identificador mientras se utiliza como identificador para declarar el método "principal"?

Para un lenguaje tan clásico :

public class Foo{
   public static void main(String[] args){
   }
}

main no es una palabra clave y probablemente nunca sería una palabra clave en Java por obvias razones de compatibilidad retro.


Acerca de la pregunta, es main un buen identificador ?

Primero : válido para un compilador no significa necesariamente bueno.
Por ejemplo, la opción java1234 que se propone también es un identificador válido, pero que realmente debe evitarse.

main tiene un significado muy particular e importante: se utiliza como el método de punto de entrada de clases y jars ejecutados por la línea de comandos java.
Usar main para un nombre de método que no rellene los criterios que utilizará la línea de comandos java sería engañoso, mientras que usarlo como nombre de variable o nombre de clase podría tener sentido.
Por ejemplo, definir la clase que representa el punto de entrada de una aplicación como la clase Main de la aplicación es aceptable y por lo tanto usarlo como nombre de variable también como:

public class Main {

  public static void main(String args[]){
     Main main = new Main();
     // ...
  }      

}

De manera general, en Java, múltiples caracteres o "palabras" se consideran identificadores válidos para el compilador, pero se desaconseja fuertemente que se utilicen en el código del cliente (pero el código generado puede hacer eso : clases anidadas, por ejemplo) como no legibles y/o realmente engañosas.

Por ejemplo, esto podría ser válido para el compilador :

public class Object { // 1
    public void foo() {
       ...
    }
}

public class BadChosenIdentifier {

    public static void main() { // 2
        new BadChosenIdentifier().toString(new Object());  
    }

    public void toString(Object java1234) { // 3, 4
        String _result$ = java1234 + " -> to avoid"; // 4
        System.out.println(_result$);
    }    
}

Pero no lo hacemos want:

  • para nombrar Object nuestra clase como se define en java.lang (1).
  • para nombrar un método main() si no llena los criterios a ser utilizados por la línea de comandos java (2).
  • para sobrecargar el método Object.toString() (3).
  • para nombrar nuestras variables con _, $ o cualquier personaje sorprendente / sin significado que vaya en contra de las convenciones de nomenclatura compartidas (4).
 37
Author: davidxxx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-17 07:52:34

Es un identificador válido? Sí.

Es un buen identificador? No si lo estás usando para algo que no sea el método que comienza en el lanzamiento de JVM.

¿Aparece otro identificador válido? Sí.

¿Las instrucciones de la prueba dicen que hay que elegir la mejor respuesta?

 34
Author: user1423956,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-11 16:38:50

Tiré todo lo que pude, y parece que funciona. Yo diría que main es un identificador válido.

package main;

public class main {

    static main main;
    String Main;

    main(String main) {
        Main = main;
    }

    main(main main) {
        System.out.println(main.Main);
    }

    main main(main main) {
        return new main(main);
    }

    public static void main(main...Main) {
        main:
        for (main main : Main) {
            main = (main instanceof Main) ? new main(main): main.main(main);
            break main;
        }
    }

    public static void main(String[] args) {
        main = new main("main");
        main.main(main, main);
        main = main.new Main(main) {
            main main(main main) {
                return ((Main)main).main();
            }
        };
        main.main(main);
        main.main(main,main);
    }

    abstract class Main extends main {
        Main(main main) {
            super("main");
        }

        main main() {
            main.Main = "Main";
            return main;
        }
    }
}
 32
Author: 18107,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-13 13:22:19

main es perfectamente válido porque, de los documentos :

  1. Es una "secuencia de letras Java y dígitos Java, el primero de los cuales es una letra Java"
  2. No es una palabra clave
  3. No es un literal booleano es decir, "verdadero"o" falso "
  4. No es literal nulo
 25
Author: zero298,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-10 20:07:52
public class Main {
    private static String main;
    public static void main(String[] main) {
        Main.main = main[0];
        new Main().main(Main.main);
    }
    private void main(String main) {
        System.out.println(main);
    }
}
 24
Author: kabra.dabar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-11 10:41:13

Ese maestro cometió un error menor al asumir que main no es un identificador válido o simplemente al formular la pregunta incorrectamente. Posiblemente quiso decir "un buen identificador".
Pero ignorar los argumentos de sus hijos y, por lo tanto, desalentar su enfoque científico de verificar la literatura relevante (especificación de Java) y realizar un experimento (escribir un programa de muestra) es lo exactamente opuesto de lo que se supone que debe hacer un maestro.

 2
Author: user82593,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-25 09:05:32

Tanto main como java123 son identificadores válidos, main no es una palabra clave reservada, por lo que es perfectamente aceptable de usar, en lo que respecta a la prueba, debería haber obtenido un punto o medio punto al menos.

 1
Author: shavar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-16 11:12:02
  1. Debe ser una sola palabra. Es decir, no se permiten espacios.

    Ejemplo: mangoprice es válido, pero el precio de mango no es válido.

  2. Debe comenzar con una letra (alfabeto) o subrayado o símbolo$.

    Ejemplo: price, _price y price price son identificadores válidos.

  3. No debe ser una palabra clave de Java ya que la palabra clave tiene un significado especial para el compilador.

    Ejemplo: clase o vacío sucesivamente.

  4. No debe comenzar con un dígito, pero el dígito puede estar en el medio o al final.

    Ejemplo: 5mangoescost no es válido y mango5cost y mangocost5 son válidos.

  5. La longitud de un identificador en Java puede ser de 65.535 caracteres y todos son significativos. Los identificadores distinguen entre mayúsculas y minúsculas. Es decir, tanto el mango como el mango son tratados de manera diferente. Puede contener todas las letras mayúsculas o minúsculas o un mezcla.

IDENTIFIER : son nombres de clases, nombres de métodos, nombres de variables ...

Como main no es una palabra reservada y de acuerdo con la explicación anterior para definir un identificador main es un identificador válido y java1234 también.Las opciones restantes no son válidas debido a la explicación anterior.

 0
Author: subhashis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-04 14:02:50

Puede usar cualquier palabra que no sea una palabra Clave, Booleana, Null o que comience con Número como identificador, la palabra "main" es el identificador más utilizado, pero - en su caso - puede usar java1234.

 -1
Author: Ahmed Tag Amer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-17 09:24:46
    option b and c boths are valid, because main is not a keyword or reserve word it's also valid.
   option a,d and e is invalid because you cant declare the identifiers with which have start with number or special character(except _ and $).
you can declare - abc_123,_abc,$abc
but can't declare like 123_abc,123_ 
 -1
Author: Deependra Singh Patel thegun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-05 11:24:50