Como mainnão pôde ser usado como identificador enquanto é usado como identificador para declarar o método "principal"?
Para um idioma tão clássico:
public class Foo{
public static void main(String[] args){
}
}
main não é uma palavra-chave e provavelmente nunca seria uma palavra-chave em Java por razões óbvias de compatibilidade retroativa.
Sobre a pergunta, é mainum bom identificador?
Primeiro: válido para um compilador não significa necessariamente bom.
Por exemplo, a java1234opção proposta também é um identificador válido, mas que realmente deve ser evitado.
maintem um significado muito particular e importante: é usado como o método de ponto de entrada de classes e jarros executados pela javalinha de comando.
Usar mainum nome de método que não preencha os critérios a serem usados pela javalinha de comando seria enganoso, mas usá-lo como nome de variável ou nome de classe pode fazer sentido.
Por exemplo, definir a classe que representa o ponto de entrada de um aplicativo como a Mainclasse do aplicativo é aceitável e, portanto, usá-lo também como nome de variável, como:
public class Main {
public static void main(String args[]){
Main main = new Main();
// ...
}
}
De maneira geral, em Java, vários caracteres ou "palavras" são considerados identificadores válidos para o compilador, mas são fortemente desencorajados a serem usados no código do cliente (mas o código gerado pode fazer isso: classes aninhadas por exemplo) como não legíveis e / ou realmente enganoso.
Por exemplo, isso pode ser válido para o 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$);
}
}
Mas nós não queremos:
- para nomear
Objectnossa classe, conforme definido em java.lang(1).
- nomear um método
main()se não preencher os critérios a serem usados pela javalinha de comando (2).
- sobrecarregar o
Object.toString()método (3).
- para citar nossos variáveis com
_, $ou quaisquer caracteres surpreendentes / unmeaningful que vão contra as convenções de nomenclatura comum (4).