私最近学んだJava ソース コード内では、Unicode は Unicode 文字 (例: ) としてだけでなくdouble π = Math.PI;
、エスケープ シーケンス (例: ) としても許可されますdouble \u03C0 = Math.PI;
。
最初の方法は、プログラマーが変数やメソッドに自分の選んだ国際言語で名前を付けることができるので、私には理にかなっているように思えます。しかし、2 番目のアプローチには実用的な用途がないと思います。
以下は、Java SE 6 および NetBeans 6.9.1 でテストされた、使用方法を説明するためのコードの一部です。
このコードは3.141592653589793を出力します
public static void main(String[] args) {
double π = Math.PI;
System.out.println(\u03C0);
}
説明: π と \u03C0 は同じ Unicode 文字です
このコードは何も出力しません
public static void main(String[] args) {
double π = Math.PI; /\u002A
System.out.println(π);
/* a comment */
}
説明: 上記のコードは実際には次のものをエンコードします:
public static void main(String[] args) {
double π = Math.PI; /*
System.out.println(π);
/* a comment */
}
これは print ステートメントをコメント アウトします。
私の例からだけでも、この言語機能にはいくつかの潜在的な問題があることがわかりました。
まず、下手なプログラマーがこれを使用して、コードの一部をこっそりコメントアウトしたり、同じ変数を識別する複数の方法を作成したりする可能性があります。おそらく、私が考えていない他の恐ろしいことが行われる可能性があります。
2 番目に、IDE のサポートが不足しているようです。NetBeans も Eclipse も、例に対して正しいコード強調表示を提供しませんでした。実際、NetBeans は構文エラーさえもマークしました (コンパイルは問題ではありませんでしたが)。
最後に、この機能は十分に文書化されておらず、一般的に受け入れられていません。プログラマーは、他のプログラマーが認識して理解できないものをコードで使用するのでしょうか? 実際、私はこれについて何も見つけることができませんでした。隠されたJava機能に関する質問。
私の質問は次のとおりです:
Java では、なぜエスケープされた Unicode シーケンスを構文内で使用できるのでしょうか。多くの「短所」があるにもかかわらず、この機能が Java の一部として存続することを可能にした「長所」は何でしょうか。
ベストアンサー1
Unicode エスケープ シーケンスを使用すると、ソース コードを純粋な ASCII で保存および転送しながら、Unicode 文字の全範囲を使用できます。これには 2 つの利点があります。
非 ASCII 文字を処理できないツールによって非 ASCII 文字が壊れるリスクはありません。これは、Java が設計された 1990 年代初頭には本当に懸念事項でした。非 ASCII 文字を含むメールを送信し、それが壊れずに届くことは、通常ではなく例外でした。
コンパイラとエディター/IDE に、ソース コードを解釈するためにどのエンコーディングを使用するかを伝える必要はありません。これは、依然として非常に有効な懸念事項です。もちろん、はるかに優れた解決策は、ファイル ヘッダー内のメタデータとしてエンコーディングを持つこと (XML の場合など) でしたが、当時はまだこれがベスト プラクティスとして登場していませんでした。
最初の方法は、プログラマーが変数やメソッドに自分の選んだ国際言語で名前を付けることができるので、私には理にかなっているように思えます。しかし、2 番目のアプローチには実用的な用途がないと思います。
どちらもまったく同じバイトコードになり、言語機能として同じ機能を持ちます。唯一の違いはソースコードにあります。
まず、下手なプログラマーがこれを利用してコードの一部を秘密裏にコメントアウトしたり、同じ変数を識別する複数の方法を作成したりする可能性があります。
プログラマーについて心配な場合は故意にコードの可読性を損なうこの言語機能は、問題としては最小のものです。
第二に、IDE 間のサポートが不足しているようです。
これは、機能やその設計者のせいではありません。しかし、この機能が「手動で」使用されることを意図していたとは思えません。理想的には、IDE には、文字を通常どおり入力して通常どおり表示し、自動的に Unicode エスケープ シーケンスとして保存するオプションが必要です。IDE をそのように動作させるプラグインや構成オプションがすでにある可能性もあります。
しかし、一般的に、この機能はほとんど使用されておらず、そのためサポートも不十分であると思われます。しかし、1993 年頃に Java を設計した人々は、どうしてそれを知っていたのでしょうか?