変数名、関数名に予約語を使ってみる

今年に入って JavaFX で少しまともなアプリケーションを作成するためのライブラリを準備しているのですが、 (なかなか進みませんが、そのうち紹介できるかな...) ちょっとした発見があったので、メモを兼ねて 約一ヶ月ぶりのエントリ...
それ程こだわってきた訳でもないですが、そろそろ英語のタイトルもつらくなってきたので日本語にすることに...

で早速 ちょっとした発見ですが...
なんと JavaFX では変数名や関数名に予約語が使えるのです。
目からウロコ、Java の常識ではちょっと考えられない...
実はちょっとした間違えで予約語を変数名に使ったところ、コンパイル時に

Perhaps you tried to use a keyword as the name of a variable (use <<keyword>> if you need to do this).
のようなエラーメッセージが...
まさか... と思いながらも 試しに以下のように予約語を << >> で括ってみたところ、
なんとちゃんとコンパイルが通るではないですか!!

Main.fx
function <<delete>>(): Void {
    println("delete");
}

public class Main {

    public var <<reverse>>: Boolean;

    function <<init>>(): Void {
        println("init");
    }
}

もちろん、ちゃんと実行もできます。
ただし、予約語を使った変数や関数を利用する場合は少しだけ注意が必要です。
例えば、上記の Main.fx の run 関数内で

public function run() {
    delete();
}
のようにスクリプト関数をそのまま使うとコンパイルエラーになるので
public function run() {
    Main.delete();
}
のようにクラス名を付けないとダメみたい...

また、Main クラス内で関数を利用する場合、例えばクラスの初期化時に

init {
    init();
}
とするとコンパイルエラーになるので
init {
    this.init();
}
のように this を付けましょう。

このようにちょっと注意すれば、結構使える仕様なのですが...
一つだけ問題が...
いろいろ試してみたのですが、たぶん インスタンス生成時に変数を初期化する場合は

var main = Main { <<reverse>>: true };
main.reverse = false;
のように << >> で括るしかない...
もちろん、初期化後に値を代入する場合は << >> で括る必要はないのですが...
クラスを利用する側にも << >> を強要するのはちょっといただけない。 と言うことで 変数に予約語を使うのは避けた方が良いと思います。

もちろん、関数についても 予約語を使わないに越したことはないのですが...
init, insert, delete 等は普通に使いたかったりします。
関数について言えば、上記の注意点は いずれも関数を定義したクラス内での話なので、
作る側さえ注意すれば、そのクラスを利用する側は特に意識する必要はないはず...
クラスを利用する側は 関数名のみを指定することはなく 必ず

var main = Main {}
main.insert(hoge);
のように記述するので、予約語の関数であってもコンパイルエラーになることはないからです。

と言うことで、関数名に予約語はありではないでしょうか...
ただ、static import の場合は、関数名のみで呼び出せてしまうので、スクリプト関数で予約語を使うのは避けた方がよいかも...