2015/03/21 このエントリーをはてなブックマークに追加 はてなブックマーク - 【Kotlin】M11(マイルストーン11)はAndroid開発者のためにある

【Kotlin】M11(マイルストーン11)はAndroid開発者のためにある



JetBrains社サイトより引用



2015年3月19日にKotlinのM11(マイルストーン11)がリリースされました。
そしてリリース内容を色々眺めていたのですが、テンションの上がる内容ばかり。
Android技術者がKotlinを使いやすくする前向きな姿勢がJetBrainsのアップデートからも読み取れます。

今回は、変更の中で特にAndroid開発者向けの変更と思われるものを
リリース情報をJetBrainsのブログから雑に翻訳してみました。
元記事はこちらです。
Kotlin M11 is Out!


注:翻訳について

以下翻訳です。










本日(2015年3月19日)、KotlinのM11をリリースした。セカンダリコンストラクタやKotlinにとって"真の"リフレクション機能などなど待望のものだ。

Today we are releasing a new milestone: Kotlin M11, which brings such long-awaited features as secondary constructors,
a first glimpse of true reflection support for Kotlin and much more.





M11ではかなりの言語変更が入っている。
そのうちのいくつかの変更および/または新しいものを優先して古い方法の廃止行っている。
あなたのコードの一部がエラーになっちゃうけど、私たちは可能な限りKotlinユーザーの修正フローが滑らかにするために最善を尽くした。

M11 brings quite a few language changes, some of which are breaking changes and/or deprecation of old ways of doing things in favor of new ones.
Some of your code may break, but we’ve done our best to make your transition path as smooth as possible.





この特徴はほとんどAndorid技術者を意識したものだ。
なぜなら、標準的なViewクラス達は1つ以上のコンストラクタを必要とする。
それが出来るようになった。

This feature has been most awaited by Android developers, because subclassing standard view classes on Android requires having more than one
constructor. Now you can do that:




class MyView : View {
    constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) {
        // ...
    }
 
    constructor(context: Context, attrs: AttributeSet) : this(context, attrs, 0) {}
}


詳しくはドキュメントを見てね。user docsspec document

Please refer to the user docs and the spec document for more details.



他の変更は、これまたコンストラクタに関連するもの。
初期化ブロックキーワードとしてinitを採用した。
この変更の主な理由としては、中括弧の初期化子がプロパティと連続した時に
うまくコンパイル出来ない不具合があったためだ。
(以前はクラス内の中括弧で囲んだスコープは初期化ブロックでした)

Another change, also related to constructors, is prefixing initializer blocks with the soft-keyword init.
The main reason for this change is that the formerly used syntax (where just curly braces in a class body denoted an initializer block) didn’t work out too
well when an initializer followed a property declaration (which is pretty common):



class Foo {
    val bar = baz() // ERROR here
 
    {
        // pre-M11 initializer
    }
}

以前のバージョンだと、こういうソースでbazを実行するときにエラーが報告された。
なぜかというと、末尾のラムダとシンタックスがかなり似ているからだ。
対策としてプロパティ初期化の直後にセミコロンを付けなければならなかったが、
Kotlinとしてはセミコロンは不自然だよね。
だから、初期化の前にinitというキーワードを使うことにした。

An error was reported on the call of baz(),
because the initializer looks exactly like a trailing lambda passed to it.
The only workaround was to put a semicolon after the property initializer, which looks rather unnatural in Kotlin.
So, since M11, we require init before the initializer block:



class Foo {
    val bar = baz()
 
    init {
        // initializer
    }
}


この古い文法は非推奨としてるので、エラーじゃないけど警告は出てしまう。
IDEが提供するAlt+Enterのクイックフィックスで古い文法は新しい文法に変換してくれるよ。
全部のプロジェクトをupdateしてくれたらね。
The old syntax is deprecated, i.e. you’ll get a warning, not an error.
Also, the IDE provides an Alt+Enter quick-fix action to convert the old syntax to the new one,
which has an option to bulk update the whole project.



詳しいことはドキュメントを見てね。
See user docs for more details.






Andoridユーザーに良いニュースだよ。KotlinでAndroidを開発するのがとても簡単にする
extentionがもたらされた。
Good news for Android users: M11 brings a useful extension that makes Android development in Kotlin easier.


findViewById()のことはみんな知ってるだろう。
こいつはバグの温床だし可読性下げるし、保守性も下げちゃうものだ。
JSR 269を利用した技術で
ButterKnifeやAndroidAnnotationsとかでJavaだとソリューションを考えたわけだが、
Kotlinではjavacに特化したAPIを使うことは困難だ(まだね)。
We all know about findViewById().
It is a notorious source of bugs and unpleasant code which is hard to read and support.
In Java the way around this
problem is through libraries such as ButterKnife and AndroidAnnotations, which rely on JSR 269, but it is a javac-specific API and is not supported in Kotlin
(yet).




M11からはfindViewById()問題をKotlin自身が解決するJSR 269も使わずにね。
全く新しいkotlin-android-extensionsというプラグインによって
Kotlinのコンパイラは型安全に余分なコードゼロでviewにアクセス出来るようになる(アノテーションとかその類いもナシにだ)。
特別なランタイムのライブラリも必要なしだ。

Since M11, Kotlin has its own solution to the findViewById() problem, which does not require JSR 269: the new kotlin-android-extensions plugin for the

Kotlin compiler allows you to access views in a type-safe way with zero extra user code (no annotations or other such things) and no runtime libraries
required.




このextensionを使うためにはGradleが有効であることと、プラグインのインストールが必要だ。 詳しくはここをみてね。
To use this extension, you need to enable it in your Gradle build and install an extension plugin into your IDE. See more here.






今回はM11の中でも特にAndroid開発者に有益な情報を切り取って翻訳してみました。
・複数のコンストラクタ
・initキーワードの初期化ブロック
・Android Extentions

の3本立てでしたが、いかがでしたでしょうか。

・今回のリリースから考えるにAndroid開発にKotlinの言語開発が歩み寄っている
・IDEの開発も行っているため、文法に変化があってもプラグインとIDEでコンバートを書けられるため、
ユーザーの混乱が少ない

など見えてくるものがありました。



ちなみにAndroid Extentionsを使うとimport文一つ書けば良く、findViewByIdは入りません。
以下の様なコードが書けます。



import android.app.Activity
import android.os.Bundle
import kotlinx.android.synthetic.activity_main.*

public class MainActivity : Activity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        textView1.setText("Hello Kotlin!!!")
    }
}


一度importでactivity_main.xmlを読みこめば、
xml内に書き込まれているTextViewやEditTextなどといったレイアウト系のViewのidで
インスタンスをとれるのです!良いでしょ!

don't be shy. try kotlin!!















本記事はJetBrains社のプログラミング言語Kotlinの公式ブログの記事を翻訳したものです。


Kotlinのブログに関してはライセンスが明記されてないようなのですが、
KotlinのWebサイトがApache License Version 2.0なので、
それに従い、翻訳しここに公開します。特に翻訳に関しては「4. Redistribution(再頒布)」の下記の部分に該当するものと判断します。



4. 再頒布

あなたは、ソース形式であれオブジェクト形式であれ、変更の有無に関わらず、以下の条件をすべて満たす限りにおいて、
成果物またはその派生成果物のコピーを複製したり頒布したりすることができます。


成果物または派生成果物の他の受領者に本ライセンスのコピーも渡すこと。
変更を加えたファイルについては、あなたが変更したということがよくわかるような告知を入れること。

sourceforge.jpのApache License, Version 2.0翻訳より引用


上記部分に従い、変更箇所について明記します。
本エントリの変更箇所(=翻訳箇所)は「はじめに」と「まとめ」以外の部分です。
青字が原文で、黒字が翻訳者である僕が翻訳をし意訳したものです。


原文全体はこちらです。
Kotlin M11 is Out!





0 件のコメント:

コメントを投稿