2012-09-20 2 views
11

최근 Google 도서관 Gson의 소스 코드를보고 나는 정말 이상한 것을 보았습니다 (IMO). com.google.gson.internal 패키지에는 "$"로 시작하는 두 개의 클래스가 있습니다. 예를

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

를 들어

는 "그것은 내부 클래스입니다 원인 사용하지 마십시오"뭔가를 달러 기호가 개발에 영향을하거나 그냥 외부 개발자에게 말을하는 것입니다합니까?

답변

8

식별자에 통화 기호 또는 연속 문자를 사용할 수 있습니다.

$를 사용하면 생성 된 것으로 나타납니다. 빌드에 의해 생성되거나 내부 용으로 만 사용됩니다. 당신은 예를 들어, 생성 된 클래스와 충돌이있는 경우

Uses for special characters in Java code

Hidden code

그것은 단지 문제가 발생합니다

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

는 컴파일러가 클래스 다이 같은 이유가 될 수있다 $로 시작하지 않는 생성

error: duplicate class: A.B 

보고합니다. 클래스에 나타날 수

윈도우 7에

, 특수 문자는

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 € { } 

다른 특수 문자는 자바로 할 수 있지만, 파일 이름으로 지원되지 않습니다. 이는 OS 및 언어에 따라 다를 수 있습니다.

+0

"모든"통화 기호를 사용할 수 있다고 생각하지 않습니다. JLS에서 : ""Java 문자 "에는 대문자와 소문자 ASCII 라틴 문자 AZ (\ u0041 - \ u005a) 및 az (\ u0061 - \ u007a)가 포함되며 역사적인 이유로 ASCII 밑줄 (_ 또는 \ u005f)와 달러 기호 ($, or \ u0024). $ 문자는 기계적으로 생성 된 소스 코드에서만 사용되거나 드물게 레거시 시스템에서 기존 이름에 액세스하는 데 사용되어서는 안됩니다. " 예를 들어, 유로화가 유효한지 의심 스럽습니다. –

+0

@JonSkeet 중요한 단어는 * include *입니다. € (유로) 표시를 포함하여 대부분의 통화 기호도 유효합니다. – assylias

+1

유로는 허용되지만 소수 중 하나입니다. 윈도우 7에서 모든 것을 시도했다;) –

1

컴파일러/런타임의 관점에서 볼 때, 이는 단지 G 또는 s과 같은 이름의 일부를 구성하는 문자 일뿐입니다. 어떤 의미 적 의미도 없습니다. 을해야

식별자는 자바 문자와 자바 자리의 무제한 길이의 순서이며, 그 중 첫째 : 그러나

language spec 당신이 $ 문자 자신 식별자의 사용을 피해야한다는 것을 암시 않습니다 자바 편지.

은 ...

은 "자바 문자"

는 대문자와 소문자 ASCII 라틴어 문자를 포함 A - 역사적인 이유로, 그리고, 아스키 밑줄 ( Z ( \u0041 - - \u005a), 그리고 AZ ( \u007a \u0061) _ 또는 \u005f) 및 달러 기호 ( $ 또는 \u0024). $ 문자는 기계적으로 생성 된 소스 코드에서만 사용하거나 드물게 레거시 시스템에서 기존 이름에 액세스하는 경우에는 사용하지 않아야합니다.

-1

아니요, 매우 잘못되었습니다. Google이 그렇게해서는 안됩니다. $ 기호는 중첩 클래스의 구분 기호로 특별히 예약되어 있습니다. JDK를 포함한 많은 코드는이 규칙 (거의 모든 사람이 준수)에 달려 있습니다.구글의 장난 꾸러기 이름 짓기 연습은 이러한 암호를 깨뜨릴 수 있습니다.

+0

구체적인 예를 들려 줄 수 있습니까? –

관련 문제