2012-09-20 16 views
11

Hace poco vi el código fuente de la biblioteca de Google Gson y vi algo realmente extraño (IMO). En el paquete com.google.gson.internal, hay 2 clases que comienzan con un "$".

Por ejemplo

public final class $Gson$Types { ... } 

¿El signo del dólar tiene un efecto de desarrollo o es sólo para decir a los desarrolladores externos algo así como "Por favor, no use causa es una clase interna"?

Respuesta

8

Puede usar cualquier signo de moneda o carácter de continuación en un identificador.

Al usar $, sugiere que se genera, p. generado por la construcción, o para uso interno solamente.

Uses for special characters in Java code

Hidden code

sólo causa un problema si tiene conflictos con clases generadas por ejemplo,

class A { 
    class B { 
    } 
} 
class A$B { 
} 

informa

error: duplicate class: A.B 

compilador genera las clases no empiezan con un $ que puede ser razón de que esto lo hace.

En Windows 7, los caracteres especiales que pueden aparecer en una clase son

public static void main(String... args) throws IOException { 
    for (char ch = 0; ch < Character.MAX_VALUE; ch++) { 
     if (Character.isJavaIdentifierStart(ch) && !Character.isLetter(ch)) 
      System.out.println("interface " + ch + " { }"); 
    } 
} 

interface $ { } 
interface _ { } 
interface ¢ { } 
interface £ { } 
interface ¤ { } 
interface ¥ { } 
interface € { } 

Otros caracteres especiales permite por Java, pero no se admiten como nombres de archivo. Esto puede depender del sistema operativo y posiblemente del idioma.

+0

No creo que pueda usar "ningún" signo de moneda. Desde el JLS: "Las" letras de Java "incluyen mayúsculas y minúsculas letras ASCII latinas AZ (\ u0041- \ u005a), y az (\ u0061- \ u007a), y, por razones históricas, el guión bajo ASCII (_, o \ u005f) y el signo de dólar ($, o \ u0024). El carácter $ debe usarse solo en código fuente generado mecánicamente o, rara vez, para acceder a nombres preexistentes en sistemas heredados ". Dudo que un signo del euro sea válido, por ejemplo. –

+0

@JonSkeet La palabra importante es * incluir *. La mayoría de los signos de moneda también califican, incluido el signo de € (euro). – assylias

+1

El euro está permitido, pero es uno de los pocos que sí lo son. Intenté todo en Windows 7.;) –

1

Desde la perspectiva del compilador/tiempo de ejecución, es solo un personaje que forma parte del nombre, como G o s. No tiene ningún significado semántico particular.

Sin embargo, el language spec sí insinúa que debe evitar el uso del carácter $ a sí mismo en los identificadores:

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

...

Las "cartas de Java" incluyen mayúsculas y minúsculas ASCII letras latinas A - Z (\u0041 - \u005a), y az (\u0061-\u007a), y, por razones históricas, el subrayado ASCII (_, o \u005f) y signo de dólar ($, o \u0024). El carácter $ debe usarse solo en código fuente generado mecánicamente o, en raras ocasiones, para acceder a nombres preexistentes en sistemas heredados.

-1

No, está muy mal, google no debería haber hecho eso. El signo $ está específicamente reservado como un delimitador en clases anidadas. Muchos códigos, incluido JDK, dependen de esta convención (que es observada por casi todos).La práctica de nombres maliciosos de Google rompería estos códigos.

+0

¿Puedes dar un ejemplo concreto? –

Cuestiones relacionadas