変数名とかクラス名とか

Java Advent Calendar 2011 12/13日*1担当のさぼてんです。


みなさん、普段あまり変数名とかクラス名とかを意識せずに付けていると思います。
え、命名には凝ってるって?
確かにそうだと思いますが、どの文字が使えるかとかはあまり考えずにやっていると思います。
例えば、アンダースコアが使えるとか、ハイフンは使えないとか、そういうのです。
殆どの人はJava言語仕様なんて読まないので、EclipseなどのIDEコンパイラからのエラーでなんとなく理解していると思われます。
僕もほとんど読んでないです。
じゃぁ、実際のところはとどうなんでしょうね。
Java言語仕様の3.8 Identifiers*2に記載があります。
http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.8
以下抜粋

Letters and digits may be drawn from the entire Unicode character set, which supports most writing scripts in use in the world today, including the large sets for Chinese, Japanese, and Korean. This allows programmers to use identifiers in their programs that are written in their native languages.
A "Java letter" is a character for which the method Character.isJavaIdentifierStart(int) returns true. A "Java letter-or-digit" is a character for which the method Character.isJavaIdentifierPart(int) returns true.
The Java letters include uppercase and lowercase ASCII Latin letters A-Z (\u0041-\u005a), and a-z (\u0061-\u007a), and, for historical reasons, the ASCII underscore (_, or \u005f) and dollar sign ($, or \u0024). The $ character should be used only in mechanically generated source code or, rarely, to access preexisting names on legacy systems.
The "Java digits" include the ASCII digits 0-9 (\u0030-\u0039).

英語を訳すの面倒くさいので、第二版ですが日本語訳もあるみたいなので、そちらを見てみます。
http://www.y-adagio.com/public/standards/tr_javalang/3.doc.htm#40625

文字及び数字は,Unicode文字集合のどの文字であってもよい。Unicode文字集合は,中国語,日本語及び朝鮮語(チョソノ)に対する大きな集合を含み,今日世界で使用しているほとんどの筆記スクリプトを扱っている。これによって,Javaプログラマは,プログラム中に,自分の母国語で書いた識別子を使うことができる。
Java文字は, メソッドACharacter.isJavaLetter(20.5.17)が true を返す文字とする。Java文字又は数字は,メソッドACharacter.isJavaLetterOrDigit(20.5.18)が true を返す文字とする。
Java字には,ASCIIラテン文字の大文字・小文字,つまり,A-Z (\u0041-\u005a)及びa-z (\u0061-\u007a),並びに,歴史的な理由によって,ASCIIの下線 (_又は\u005f)及びドル記号($又は\u0024)が含まれる。 $文字は,機械的に生成されたソースコードにおいてだけ,又は,まれには,過去のシステム上の既存の名前にアクセスするためだけに使用することが望ましい。
"Java数字"は,ASCIIの数字0-9 (\u0030-\u0039)を含む。

英数字と、記号としては_と$が使えますね。
あと、ユニコード文字列が使えます。
JUnitなどでメソッド名に日本語で書けるのも、この仕様のおかげです。
といっても、実際のプロダクトコードのほうには日本語でプログラミングしている人とかいないでしょうが、変な英語をつけるぐらいなら、いっそう日本語でそのまま書いてしまってもいいんじゃないんでしょうかね。


それはそれで置いといて、上記仕様からこんなか書き方もできるんじゃないんでしょうか。

public class _{
	public static void main(String[] args) {
		boolean x_x = true;
		String $_$ = "_";
		
		for(;x_x;)
			System.out.println($_$);
	}
}

無限ループしてるとかの野暮なツッコミはやめてください。

*1:すっかり忘れていて申し訳ないです

*2:日本語だと識別子と訳すらしいです