son - tipos de variables en java
Palabras reservadas como nombres de variables o métodos (13)
¿Hay alguna forma complicada de usar palabras reservadas de Java como nombres de variables o métodos?
¿Huh? ¿Por qué querrías hacer eso? Puedes escribirlos en l33t, eso engañará al compilador.
class cl4ss {
String r3turn() {
return "but why?";
}
}
La mayoría de las veces, este problema surge para "clase", en este caso es costumbre escribir "clazz".
No hay forma de usar palabras reservadas con el compilador javac .
Técnicamente, puede editar los nombres dentro del archivo de la clase una vez que se haya compilado para que sea lo que quiera: en esa etapa, a la VM no le importa, porque ya no se ocupa del código fuente. Creo que algunos ofuscadores usan esta técnica.
No, no hay forma. Es por eso que están etiquetados como "reservados".
No, no puedes hacer esto. Para obtener más información, vaya a JLS Secciones 3.8, 3.9
Las siguientes secuencias de caracteres, formadas por letras ASCII, están reservadas para usarse como palabras clave y no pueden usarse como identificadores (§3.8):
Keyword: one of abstract continue for new switch assert default if package synchronized boolean do goto private this break double implements protected throw byte else import public throws case enum instanceof return transient catch extends int short try char final interface static void class finally long strictfp volatile const float native super while
Sí hay. Tienes que usar palabras reservadas del futuro. Me gusta lo que sucedió con diferentes métodos llamados assert () en el código pre-1.4.
¡Espero eso ayude!
Ya es bastante malo que algunos idiomas sensibles a mayúsculas y minúsculas permitan cosas como las siguientes:
class New;
class Something
{
New makeNew()
{
return new New();
}
}
Pero ¿por qué querrías poder escribir una línea de código como esta?
class new;
class Something
{
bool if;
new makeNew()
{
return if ? new new() : null;
}
}
Solo eche un vistazo al resaltado de sintaxis. ¡Incluso se confunde!
Estrictamente hablando no se puede, a menos que tenga en sus manos una implementación del compilador con errores que no se adhiere a la especificación del lenguaje Java.
Pero donde hay voluntad, hay una manera. Copie el siguiente código en su IDE, cambie la codificación del archivo de origen a UTF-16 y aquí vamos:
public class HelloWorld {
public static void main(String[] args) {
HelloWorld.nеw();
}
public static void nеw () {
System.out.println("Hello,World");
}
}
Este código es una clase Java bien formada y válida. Sin embargo, como habrás adivinado, hay un pequeño truco: el carácter ''е'' dentro del identificador "nuevo" no pertenece al conjunto de caracteres ASCII, en realidad es una '''' '''' cyrrilic (prounanciada ''YE'').
La especificación actual del lenguaje Java permite explícitamente, y este es un punto importante para hacer, el uso de Unicode para nombrar identificadores. Eso significa que uno tiene la capacidad de llamar libremente a sus clases en francés, chino o ruso, si así lo desean. También es posible mezclar y combinar los alfabetos dentro del código. E históricamente, algunas letras en latín y otros alfabetos son similares.
Como resultado: no, no puede usar las palabras reservadas como identificadores, pero puede usar identificadores que se parecen exactamente a las palabras reservadas.
Si alguien debería estar haciéndolo es un asunto totalmente diferente.
PL / 1 (un lenguaje de programación de mainframe de IBM de los años 60 que todavía existe en la actualidad) requería, bastante famoso, que mientras algunas palabras actúan como palabras clave en ciertos contextos, todas las palabras pueden usarse como identificadores. Esto no es tan difícil de hacer en un analizador sintáctico si te propones ser coherente al respecto. PL / 1 se consideraba un lenguaje bastante extenso, y el comité de idiomas temía que muchos programadores no lo aprendieran todo, y luego se sorprendían cuando intentaban usar la palabra clave de una parte que no conocían como identificador. . Entonces podrías escribir cosas como:
IF BEGIN=ELSE THEN CALL=3 ELSE CALL FOO(ENDIF) ENDIF
Como otros han notado aquí, la capacidad de hacer esto no es una recomendación.
Los diseñadores de Java decidieron que el número de palabras clave en el idioma era modesto y reservaron el conjunto. Incluso reservaron ''GOTO'', que en realidad no está permitido en ningún programa real de Java.
No estoy seguro de lo que está tratando de hacer, pero $ es un carácter válido en los identificadores, por lo que podría hacer, por ejemplo:
int $return = 5;
Se ve un poco raro, pero funciona.
En Scala puedes usar apoyos. Por ejemplo: myVarialbe`class`
Sé que todavía es una vieja pregunta, podría ayudar a alguien.
Es posible mediante el uso del soporte de nombres de campo de GSON
p.ej.
@SerializedName("new")
private String New;
public String getNew ()
{
return New;
}
public void setNew (String aNew)
{
New = aNew;
}
Esta es una pregunta válida. Tal cosa es posible en otros idiomas. En C #, prefija el identificador con @
( como se le preguntó antes ); en Delphi, prefijo con &
. Pero Java no ofrece esa función (en parte porque no necesita interactuar con identificadores definidos por otros lenguajes de la misma manera que lo hace el mundo .Net).