¿Es main un identificador de Java válido?
language-lawyer identifier (12)
-
Debe ser una sola palabra. Eso es, los espacios no están permitidos.
Ejemplo: el mangoprice es válido pero el precio del mango no es válido.
-
Debe comenzar con una letra (alfabeto) o un guión bajo o un símbolo $.
Ejemplo: precio, _price y $ precio son identificadores válidos.
-
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 etc.
-
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.
-
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 una mezcla.
IDENTIFICADOR : son nombres de clase, 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 de mantenimiento no son válidas debido a la explicación anterior.
Uno de mis hijos está tomando Java en la escuela secundaria y tuvo esto en una de sus pruebas:
¿Cuál de los siguientes es un identificador válido en Java?
a.
123java
segundo.main
do.java1234
re.{abce
mi.)whoot
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 a la
spec
Java para identificadores y reforzó ese punto.
También escribimos un programa de ejemplo que tenía una variable llamada
main
, así como un método.
Creó una refutación escrita que incluía la referencia de documentación de Java, el programa de prueba y el profesor lo ignoraron y dice que la respuesta sigue siendo incorrecta.
¿Es el
main
un identificador válido?
¿Cómo no se podría usar
main
como identificador mientras que se usa como identificador para declarar el método "main"?
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 razones obvias de compatibilidad retro.
Sobre 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 realmente debería 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 comando
java
.
Usar
main
para un nombre de método que no cumpla con los criterios para ser usado por la línea de comando
java
sería simplemente engañoso al usarlo como nombre de variable o un nombre de clase podría tener sentido.
Por ejemplo, la definición de 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, usarla 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, varios caracteres o "palabras" se consideran identificadores válidos para el compilador, pero no se recomienda utilizarlos 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ñoso.
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 queremos:
-
para nombrar
Object
nuestra clase como esta definida enjava.lang
(1). -
para nombrar un método
main()
si no cumple con los criterios que utilizará la línea de comandosjava
(2). -
para sobrecargar el método
Object.toString()
(3). -
para nombrar nuestras variables con
_
,$
o cualquier carácter sorprendente / no significativo que vaya en contra de las convenciones de nomenclatura compartidas (4).
¿Es un identificador válido? Sí.
¿Es un buen identificador? No si lo está utilizando para otra cosa que no sea el método que comienza en el inicio de JVM.
¿Se enumera otro identificador válido? Sí.
¿Dijeron las instrucciones de la prueba elegir la mejor respuesta?
Como indican las otras respuestas
main
es un identificador de Java válido
, así como
java1234
.
Supongo que lo confuso viene del hecho de que el método
main(String[])
se usa a menudo como punto de entrada en la JVM
1
.
Sin embargo, eso no significa que el token
main
no se pueda usar como identificador
2
.
Las especificaciones lo dicen, y las siguientes declaraciones también son válidas:
-
Un campo:
private int main;
-
Una variable local:
String main = "";
-
Un método:
private void main() { ... }
-
Una clase (aunque no se recomienda un nombre de clase que comience en minúsculas):
public class main { ... }
-
Un paquete:
package main;
1: Como se señaló en los comentarios, la especificación JVM en sí misma no obliga a ningún método en particular como punto de entrada, pero la herramienta
java
ampliamente utilizada a menudo usa dicho método como punto de entrada.
2: En general, evitaría crear un método principal que no sea
main(String[])
.
Ese maestro cometió un pequeño error al asumir que
main
no es un identificador válido o simplemente está expresando mal la pregunta.
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
exactamente lo contrario
de lo que se supone que debe hacer un maestro.
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
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 por lo menos.
Tiré todo lo que pude, y parece funcionar. 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;
}
}
}
main
es perfectamente válido porque,
desde la documentación
:
- Es una "secuencia de letras Java y dígitos Java, el primero de los cuales es una letra Java"
- No es una palabra clave
- No es un literal booleano, es decir, "verdadero" o "falso"
- No es nulo literal
main
es un identificador de java válido y el profesor está equivocado.
La documentación relevante está en la especificación del lenguaje Java, aquí mismo:
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 ... Un 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 se produce un error en tiempo de compilación.
Lo que significa que puede probar que es un identificador válido usándolo como un identificador y observando que no se produce ningún error en tiempo de compilación.
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);
}
}
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 una palabra reservada.
La sección relevante del 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
IdentifierChars pero no una palabra clave o BooleanLiteral o NullLiteral
IdentifierChars:
JavaLetter {JavaLetterOrDigit}
JavaLetter:
cualquier carácter Unicode que sea una "letra de Java"
JavaLetterOrDigit:
cualquier carácter Unicode que sea una "letra o dígito de Java"
La secuencia de caracteres
main
ajusta a la descripción anterior y no se encuentra en la
lista de palabras clave en la Sección 3.9
.
(La secuencia de caracteres
java1234
también es un identificador, por las mismas razones).