質問: switch分で唐突に$と[]が出てきたのですが、このような形は初めて見ました。 これはどういう意味でしょうか。 普通ならパッケージは.でつなぎます。 また、()の後に[]とは? ``` switch($SWITCH_TABLE$org$aiwolf$client$lib$Topic()[content.getTopic().ordinal()]) ```
回答: $ == 識別子を構成する文字の一つです。下記の言語仕様書にあるように普通のソースコードで使う機会はまずありませんが、使おうと思えば使えます。試しに書いてみてください。コンパイルエラーにはならないことがわかります。 言語仕様書 識別子に使える文字("Java letters")の説明の一節 > > 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 dollar sign ($, or \u0024)** and underscore (_, or \u005f). **The dollar sign should be used only in mechanically generated source code or, rarely, to access pre-existing names on legacy systems**. The underscore may be used in identifiers formed of two or more characters, but it cannot be used as a one-character identifier due to being a keyword. > > > (太字は回答者) `$`はJavaコンパイラーやJVM上で動く他の言語が内部的な識別子として使うことが多いと思います。例えばJavaで以下のようなソースコードを書くと構文エラーではなく意味的なエラー(クラス名が重複している)となります。 ``` class A { class B { } } class A$B { } ``` なぜこんなことが起きるかといえばAの内部クラスBのクラスファイルは`A$B.class`という名前になるためだろうと思います。`class A$B {...}`は文法的に正当なのですがクラスファイルの名称が衝突してしまうため都合が悪いわけですね。実際`class A$C {...}`と記述するとコンパイルできてしまいます。しかし上のようなことを考えれば`$`は普通は使うべきでないということが納得できるのではないでしょうか? ()の後に[] ======== 識別子の後に括弧が続けばそれは「メソッド呼び出し」です。多分それはご存じだろうと思います。そのメソッドの戻り値が配列だったら・・・と考えてみてください。当然その後に`[指標を表す式]`を続ければ配列の要素を表せます。 わかってしまえば「なぁんだ」と感じると思います。 ``` class Foo { static String[] strings() { return new String[] { "a", "b", "c" }; } static void bar() { String s = strings()[1]; // => "b" } } ```