String in JavaFX

今更ながら...
String について知らなかったことが 2つ もあったので書き留めておきます。

それは...

  1. 文字列リテラルを縦 (横もOK) に並べるだけで結合できる (C 言語と同様)
  2. null は 空文字列 に変換される

の2つです。

前者は、ちゃんと Language Reference にも書いてありましたが...
以下のように文字列リテラルを縦に並べるだけで結合できるので 非常に便利です。
JavaFX は 文字列を + で結合できないため concat するしかないと思い込んでいただけにちょっと感動です。

def greeting = "Hello "
               'there';
println( greeting );

実行結果:

Hello there

後者は、多くの NPE によるバグを救ってくれるので、非常にありがたいように思いますが...
実は この仕様のために思わぬバグを生むこともあるのです。
今回、自分も思い切りハマったのですが、次の典型的なコードは意図しない動きをします。
このコードでファイルなどを読み込んだ場合、空行が含まれているとそれ以降の行が読み込まれないのです。

var r = new java.io.BufferedReader(in);

var s: String;
while ((s = r.readLine()) != null) {
    println(s);
}

実は JavaFX では "" == null になります。
たぶん null が 空文字に変換されるからだと思いますが...

実際に...

println("" == null)

を実行してみると

true

と出力されます。

ちなみに、この仕様も Language Reference に ちゃんと明記されていました。最初はわかりませんでしたが...
String のようにカーディナリティが Required のデータ型については null を許容しないようです。
null を代入すると 初期値に変換されてしまいます。

この問題は この日記で作成した 『TranslatorFX』 で気が付いたのですが...
文の途中に空行を入れて、翻訳ボタンを押すと空行以降の文が翻訳されないのです。
正確には、翻訳されているのですが読み込めていないのです。
このバグは本日中には修正する予定ですので、この現象を試してみたい方は (いるわけないか?) 本日中に...


追伸:

上記の 『TranslatorFX』 の不具合を修正しました。
詳細については、次回と言うことで...