今回は
Ceylon言語ってどんなもの?
で紹介したCeylonの良いとこをコードで紹介。
Ceylon開発環境は Ceylon環境の作り方からどうぞ。
#リテラル定義が便利
Javaは定義のときが固過ぎてListやMapを定義したいときに不便だなーと感じるところがありますが
その辺が改善されています。
(Java8でちょっと改善されそうだけど、まだリリースされないんだよね・・・。)
配列はいつものように出来ます
String[] a = ["a","b","c"];
Integer[][] b = [[2, 3], [5, 7], [11, 13]];
Listで受け取ればListになっちゃいます。
List<String> a2 = ["a","b","c"];
List<List<Integer>> b2 = [[2, 3], [5, 7], [11, 13]];
もちろんジェネリクスも効いているので型は安全。
Mapも出来ます。
Map<String,String> m = LazyMap{ "test"->"hogehoge", "foo"->"bar" };
key -> valueの順で宣言して「,」で複数できます。
簡単ですね!
#静的型付けである
なんと言ってもJava好きな人はこれは重要な事項だと思います。
メソッドやフィールドの参照先は正確に飛べるし、
間違ったメソッド名などでは事前にコンパイルエラーで教えてくれるし
静的な型付けのメリットはありますよねー。
動的なのが好みの人にはわずらわしいと感じる部分もあるけど
保守とか長い目で見ると便利な面が多いかなーと個人的には思ってます。
List<List<Integer>> a = [[2, 3], [5, 7], [11, 13]];
print(a.get(1)); // [5,7]
print(a.hoge()); // コンパイルエラー
定義されていないメソッドがあれば当然コンパイルエラーになります。
実行されるまで分からない動的言語との違いかなと思います。
#型推論がある
先ほどのList宣言されたものですが、
value a = [[2, 3], [5, 7], [11, 13]];
のように書き換えることが出来る。
value s = "hoge"; // String
value i = 1; // Integer
value f = 1.0; // Float
上記のように宣言すれば
それぞれvalueと指定されていても
コメントでの型として処理されるので楽です。
型も効きつつ、手軽に宣言出来ます。
特にネストされたListやMapなどは楽になります。
リテラル定義のときに出てきた
Map<String,Object> m = LazyMap{ "test"->"hogehoge", "foo"->"bar" };
このコードも
value m = LazyMap{ "test"->"hogehoge", "foo"->"bar" };
とすればMapとして利用出来ます。
#デフォルトで変数のnull禁止
String s1 = null; // コンパイルエラー
上記のように普通に宣言しただけではnullをセット出来ず
コンパイルエラーとなります。
nullをセット出来る変数を作成するには「?」を型の名前の後ろにつけます。
String? s1 = null;
さらにnullを許容する変数を参照して呼び出す場合
existsでチェックしたスコープの中でしか使うことが出来ません。
String? s2 = "hoge";
print(s2.size); // コンパイルエラー
上記のコードではコンパイルエラーになります。
nullを許容する変数を使うには以下のようにします。
String? s2 = "hoge";
if(exists s2) {
print(s2.size);
}
これでJavaで悩まされていたnullの扱いを制限し
よく目にしていたNullPointerExceptionが発生しなくなると思われます!
#デフォルトで変数に再代入できない
変数を宣言しただけではその変数に再代入出来ません。
String s3 = "foo";
s3 = "bar"; //コンパイルエラー
書き換え可能な変数を宣言するにはvariableを付けて宣言する必要があります。
variable String s3 = "foo";
s3 = "bar";
あえて書き換えが可能にする必要があるときだけ
その変数を宣言するということで意識することが出来ます。
#基本的にキャスト禁止(型チェックのスコープが厳密)
value list = ["hoge", 1 , 1.0];
for (e in list) {
if(is String e) {
// Stringとしてeを使うことが出来る
}
if(is Integer e) {
// Integerとしてeを使うことが出来る
}
if(is Float e) {
// Floatとしてeを使うことが出来る
}
}
Javaであればinstanceofなどでチェックした後に
自前でキャストしていましたが
Ceylonでは「is 型」でチェックし、その後のスコープでのみ
その型として扱うことが出来るようになっています。
スコープを出ると型として使うことが出来ず、
型固有のメソッドなどを呼び出そうとしてもコンパイルエラーとなります。
この機能によって潜在的なキャストエラーを防ぐことが出来ます。
#まとめ
Javaで暗黙的に行われることで潜在的なエラーとなっていた
nullやキャストの問題、変数の宣言時の固さなどが改善されて
細かいけれども重要な部分に気を使われていて、「これ良いな!」って自分は感じました!
それで居ながらJavaとほとんど変わらない感覚で書けるし
Scalaほどたくさんの機能が入って難しくなってる訳でもない感じがいい感じ。
Ceylonの良さが光ります。
これを読んで興味出た人は
JavaをEclipseでやってる人はプラグインを入れればすぐ出来るので
開発環境を設定して ぜひ触ってみて見てくださいー。