はじめに
ということで、KotlinのM13がリリースされました。
ほぼ、公式blogのそのまま書くつもりなので、詳細は原文参照のこと。
Kotlin M13 is out!
今回の変更は言語の最終仕様の決定と言ってもいいでしょう。
そして、それぞれユーザーに意見を求めていた結果をフィードバックして、
言語デザインに反映しています。
変更のサマリ
変更をまとめるとこんな感じです。
・コンパイラのdaemonがより早くなった
・lateinitというプロパティでDIサポート
・sealed classで代数型サポート
・ターゲットアノテーションのspecifyingとチェック
・JavaのGetter/Setterの組み合わせをKotlinのプロパティとして扱えるようになった
・アノテーションと修飾子を分割した
・Fullly functional Reflection
・internalへのアクセスをモジュールの外部で行うようになった
・トップレベル関数がktファイル単位でJavaのクラス互換になった
and more
言語の変更
言語の最終アップデートがほぼ終わったようです。
細かな変更はあるかもしれませんが、マイグレーションのサポートはしますよ、と。
Kotlinの内包するJavaScriptランタイムに関しては実験的な機能追加を考えているが、
メジャーバージョンリリース後となるとのこと。
KotlinのJVMランタイムの方はほぼ仕様が固まった、ということだと思います。
DIのサポート
今まで、アノテーションベースのDIと相性が少し良くなかったKotlinですが、
lateinitにより、かなり改善されました。
詳しくはたろうさんのblog参照のこと。
Kotlin M13で追加されたlateinit試してみた- 算譜王におれはなる!!!!
代数型クラス
いわゆるsealedクラスです。
型によるパターンマッチが出来るので、過去にTupleでKotlinがやろうとしてたことを補うかな。
まぁ、厳密にはまた別物だと思うのですが。
こちらもたろうさんなblog参照のこと。
Kotlin M13で追加されたsealed class - 算譜王におれはなる!!!!
アノテーションと修飾子の分離
Kotlinチームはアノテーションと修飾子の分離を考えて、意見を求めていました。
Modifiers vs Annotations
今までのKotlinはアノテーションと修飾子は記述的には同じようなものでした。
(アットマークなしのキャメル記法)。
また、アノテーションはM12あたりからアットマークをつけるのは言ってたと思うんですが、
オプショナルなものでした。
M13からは@がアノテーションには必須となり、今までアノテーションとして扱っていたものを修飾子として再定義したようです。
Javaとの互換のためのアノテーションは以下のようになります
@Throws - Javaのthrows
@Volatile - Javaのvolatile
@JvmName - Javaでのクラス名
@JvmStatic - Javaでのstatic
以下のアノテーションは修飾子に。
data - dataクラスとかに使う
inline - インライン化する時に使う
noinline - インライン化しない時に使う
crossiniline @inlineOption(ONLY_LOCAL_RETURNS)を変更
tailrec @tailRecursiveを変更。末尾再帰最適化
external @nativeを変更。Java互換のためのもの
個人的にはこの変更は分かりやすく良いです。今までは、
「あれはアノテーションだっけ?修飾子?」
って感じだったので笑
変更はIDEがよしなにやってくれるようです。
targetアノテーションとその他オプション
以下のアノテーションをサポートするようになりました。
@Retention 実行タイミング指定、Javaと同じ感じ
@Target
@MustBeDocumented ドキュメントのためのマーカーアノテーション
@Repeatable 複数回エレメントを繰り返すためのマーカーアノテーション
class Example(
@field:MyFieldAnnotation(...)
val foo: Foo
)
M13以前はプライマリコンストラクタで
コンストラクタインジェクションしなければなりませんでした。
かなりフィールドインジェクションしやすくなったので
Jacksonとかも便利に使えるで!とのこと。
可視性(Visibilities)
アクセス修飾子の可視性にも変更があったようです。
トップレベルのprivateはファイル内のスコープのアクセスのみ許します。
修飾子なしのデフォルトはinternalからpublicへ変更。
これまで、Kotlinチームはスコープについて悩んでいて、
ユーザーの意見を取り入れようとしていました。
結果的にデフォルトスコープをpublicとして選んだのですね。
Kotlinは型安全な言語で、より安全にするにはprivate。defaultはもう少しロジカルであろう、とのこと。
だからデフォルトスコープはpublicが妥当だ、という結論みたいです。
(Javaだとパッケージプライベートですね)
Javaコーディングでは色んなところでpublicを書くことになる。
コードをクリーンに保つためにはpublicをデフォルトにしたい!という感じ。
internalは残ったままですが、デフォルトではなくなったので今後は明示するに必要があります。
オーバーロードされた関数の参照呼び出し
参照呼び出しのオーバーロードサポート。
関数fooがオーバーロードされたとしても、
::foo
と書けます。
シグネチャは文脈によって、選ばれる。つまり、実行時の判断ってことですかね…?
明確なsuper実行はジェネリクスのダイヤモンド無しで実行できる。
型パラメータの厳密なnullabilityのチェックも出来るようになった
デフォルト引数のない関数はオーバーロードがやりやすくなった、とのこと。
@HiddenDeclarationというアノテーションでバイナリを維持しつつクライアントからの宣言を隠蔽出来るようになった。
うーむ、よう分からん。
Javaのget/setのペアをKotlinのプロパティとして解釈する
Javaのクラスを読み込むとき、明示的にゲッターセッターを呼び出さなければならなかったけど、今後はKotlinと同様に呼び出せます。
以下のような感じ。
// Java: class JBean { public Foo getFoo() { return ...; } public void setFoo(Foo foo) { ... } } // Kotlin <br/> fun demo(bean: JBean) { println(bean.foo) // 'foo' is automatically defined }
コンパイル時に最適化してるとのこと。
これで、Javaとの互換性が更に上がりました。やったね!
トップレベルの定義のclass化レイアウト変更
Kotlinチームはトップレベルの定義のJava互換に関しても意見を求めていました。
Improving Java Interop: Top-Level Functions and Properties
今まではトップレベル関数はパッケージに属していたんですが、
これからはファイルに属するような形になります。
Javaからの呼び出しが楽になりますね!
今まで
java HogePackage
これから
java ファイル名
大雑把に言うと、こうです。
また、ファイル名でなくても@JvmName("CustomName") という風に任意にクラス名を定義できるようになっています。
この変更により、ビルドツールのエントリポイント指定もデフォルトが変わるのでAntやMaven、Gradleは修正が必要です。
Null安全のJava互換
これに関しても以前議論されていました。
Upcoming Change: More Null-safety for Java
Javaで@NotNull and @Nullableを使うことが出来ます。
誤用の場合は、コンパイルエラーではなく、WARNINGとなるらしいです。
つまりJavaとKotlinのnull安全の距離がグッと縮まったわけですね!
ArrayListの中身がnullだった、なんてこともなくなる!
Java側では静的なnullチェックはされないため、
Platform typesは残ったままです。
@NotNullと@Nullableが誤用されたりする場合も想定しているとのこと。
ライブラリLibraries
Kotlin周辺のライブラリも便利になったよとのこと。
functionalにリフレクションが出来るように改善されたらしいです。
あと、コレクションライブラリとDelegate Propertiesも便利に。
これは別のブログ記事として公開するっぽいです。
ツール
コンパイラのdaemonが入りました.
Gradleのdaemonをサポートします。
これによってパフォーマンスは落とさずにインクリメンタルなビルドが出来るようになった!多分。
(ここらへん詳しくない)
まとめ
とりあえず、急いで書いてみましたが、結構大きな変更もあり、
そして、仕様が確定してきました。メジャーリリース近し。
なかでも大きな変更は ・代数型サポート
・DIサポート
・Java互換性の向上
・アクセス修飾子の変更
といったところですかね。
Javaとの互換性、ビルドスピードなど
掲げていたポリシーを貫いている感じがいいですね!
段々とKotlinは実用的になってます!!!
0 件のコメント:
コメントを投稿