12

Java 変数名に特殊文字 ( $,を除く) を使用できないのはなぜですか?_

4

3 に答える 3

19

これは事実ではありません - 多くの特殊文字が実際には識別子として有効です。JLS #3.8で定義されています。

識別子は、Java 文字と Java 数字の無制限の長さのシーケンスであり、最初の文字は Java 文字でなければなりません。
[...]
「Java 文字」は、メソッドCharacter.isJavaIdentifierStart(int)が true を返す文字です。
「Java 文字または数字」は、メソッドCharacter.isJavaIdentifierPart(int)が true を返す文字です。

たとえば、これは有効な変数名です。

String sçèêûá¢é£¥ = "bc";

次の単純なコードで、すべての有効な文字を確認できます。

public static void main(String args[]) {
    for (int i = 0; i < Character.MAX_VALUE; i++) {
        if (Character.isJavaIdentifierPart(i)) {
            System.out.println("i = " + i + ": " + (char) i);
        }
    }
}

追伸: @PeterLawrey のブログの素敵な例

于 2012-10-12T10:46:37.310 に答える
15

実際には、Java 識別子でそのまま使用できる特殊文字は膨大な数に上ります。たとえば、すべての通貨記号と 10 個の継続文字 (_ だけでなく) すべてを使用できます。

if( ⁀ ‿ ⁀ == ⁀ ⁔ ⁀ || ¢ + ¢== ₡)

さらに奇妙なことに、文字が見えなかったり、テキストが逆に印刷されたりすることがあります。

次のプログラムは\u202e、「特別な」外観をもたらす識別子を持っています。

for (char c‮h = 0; c‮h < Character.MAX_VALUE; c‮h++)
    if (Character.isJavaIdentifierPart(c‮h) && !Character.isJavaIdentifierStart(c‮h))
        System.out.printf("%04x <%s>%n", (int) c‮h, "" + c‮h);

これにより、コンパイルおよび実行される識別子で許可されているすべての特殊文字が出力されます。

http://vanillajava.blogspot.co.uk/2012/09/hidden-code.html

http://vanillajava.blogspot.co.uk/2012/08/uses-for-special-characters-in-Java-code.html

于 2012-10-12T10:52:46.567 に答える
8

次のコードはすべてJavaで有効です...

int Δ = 1;
double π = 3.141592;
String 你好 = "hello";
Δ++;
System.out.println(Δ);

これらは変数名のかなり特殊な文字だと思います。

ソース: http://rosettacode.org/wiki/Unicode_variable_names#Java

于 2012-10-12T10:51:28.047 に答える