Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Annotations specific to the Java platform.

tebasakyu
August 22, 2017

Annotations specific to the Java platform.

tebasakyu

August 22, 2017
Tweet

More Decks by tebasakyu

Other Decks in Programming

Transcript

  1. Annotations specific to
    the Java platform.
    2017.08.22 夏のKotlin LT祭
    @tebasakyu

    View full-size slide

  2. 自己紹介
    ● 鈴木 誠 (Makoto Suzuki)
    ○ 娘: 遙華(Haruka) 5ヶ月
    ● Monstar Lab, Inc.
    ● Android Engineer
    ● Twitter: @tebasakyu

    View full-size slide

  3. Annotations
    公式リファレンス
    https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/index.html#annotations
    ● Javaとの相互運用には欠かせないもの
    ○ 100%Kotlinなら不要
    ○ KotlinからJavaへの優しさ

    View full-size slide

  4. ● JvmField
    ● JvmMultifileClass
    ● JvmName
    ● JvmOverloads
    ● JvmStatic
    ● JvmSuppressWildcards
    ● JvmSynthetic
    ● JvmWildcard
    ● PurelyImplements
    ● Strictfp
    ● Synchronized
    ● Throws
    ● Transient
    ● Volatile
    これで全部です。

    View full-size slide

  5. ● JvmField
    ● JvmMultifileClass
    ● JvmName
    ● JvmOverloads
    ● JvmStatic
    ● JvmSuppressWildcards
    ● JvmSynthetic
    ● JvmWildcard
    ● PurelyImplements


    ● Throws


    これだけ書きました。

    View full-size slide

  6. ● JvmField
    ● JvmMultifileClass
    ● JvmName
    ● JvmOverloads
    ● JvmStatic
    ● JvmSuppressWildcards
    ● JvmSynthetic
    ● JvmWildcard
    ● PurelyImplements


    ● Throws


    よく使いそうなのはこの辺りですね。

    View full-size slide

  7. ● JvmField

    ● JvmName
    ● JvmOverloads

    ● JvmSuppressWildcards





    ● Throws


    今日はこの辺りを話します。

    View full-size slide

  8. @JvmName
    ● クラス名、メソッド名にJavaからの実行用別名をつける
    View.kt
    @file:JvmName("View")
    package com.xxx.extensions
    fun View.toVisible() {
    this.visibility = View.VISIBLE
    }

    View full-size slide

  9. MainActivity.java
    ViewKt.toVisible(textView);
    textView.setVisibility =View.GONE;
    MainActivity.java
    View.toVisible(textView);
    textView.setVisibility = android.view.View.GONE;
    ● @JvmName無しの場合
    拡張関数の命名規則を”com.xxx.extentions.<拡張元クラス名>”などとしている場合、
    下手に別名を付けると面倒なこともある。

    View full-size slide

  10. @JvmOverloads
    ● デフォルト値付き引数を持つメソッドのオーバーロードを生成
    する
    @JvmOverloads fun hoge( bool: Boolean = false ) { }
    生成されたJavaコード
    public void hoge() { hoge(false) } // アノテーションを付けないと出てこない。
    public void hoge(boolean bool) { } // 無しの場合はこちらだけ。

    View full-size slide

  11. @JvmSuppressWildcards
    ● ジェネリクスのワイルドカードを利用不可にする
    interface Foo
    class Bar: Foo { fun hoge(list: List<@JvmSuppressWildcards Foo>) { } }
    ■Javaから実行する
    new Bar().hoge(new ArrayList()); // OK
    new Bar().hoge(new ArrayList()); // NG (Barは extends Foo>だから)

    View full-size slide

  12. @Throws
    ● Kotlinから検査例外を明示させる
    ○ Kotlinは検査例外が無いので、try-catchを強制できない
    class Hoge {
    @Throws(IOException::class)
    fun fuga() { throw IOException() }
    }
    ■Javaから実行
    hoge.fuga(); // コンパイルエラー(「try-catchしなさい」)

    View full-size slide

  13. 相互運用せざるをえない人たちも居ます。
    そんな人たちに出会ったとき、これらのアノテーションを思い出し
    てあげてください。
    きっと救われます。

    View full-size slide

  14. ご静聴、ありがとうございましました。

    View full-size slide

  15. 以下、時間内に収まらなかったもの。

    View full-size slide

  16. @JvmField
    ● プロパティアクセスを可能にする
    ○ 通常はgetter/setterを介してアクセスさせる
    class data {
    @JvmField val hoge = "fuga" // プロパティアクセス可
    val fuga = "hoge" // getFuga() / setFuga() でアクセスする
    }

    View full-size slide

  17. @JvmStatic
    ● JavaからStatic呼び出しを可能にする
    companion object {
    @JvmStatic
    fun newInstance() : MainFragment = MainFragment()
    }
    ■Javaから実行
    アノテーションあり:MainFragment.newInstance();
    アノテーションなし:MainFragment.Companion.newInstance();

    View full-size slide

  18. @JvmMultifileClass
    ● 複数ファイルにまたがって同一の”JvmName”を利用する
    Hoge.kt
    @file:JvmName("Util")
    @JvmMultifileClass
    package com.xxx
    fun hoge() { }

    View full-size slide

  19. Fuga.kt
    @file:JvmName("Util")
    @JvmMultifileClass
    package com.xxx
    fun fuga() { }
    MainActivity.java
    com.xxx.Util.hoge();
    com.xxx.Util.fuga();

    View full-size slide

  20. @JvmWildcard
    ● ジェネリクスのワイルドカードをつける
    ○ List → List extends String>
    ○ 不要な場合(finalなど)、デフォルトでワイルドカード無しに
    なる
    fun foo(l: List) // in Java: List (String is final)
    fun foo(l: List<@JvmWildcard String>) // in Java: List extends String>
    引用元:https://goo.gl/ETK3Sm

    View full-size slide

  21. @PurelyImplements
    ● Java側がKotlinのために付ける(っぽい)
    ● 型パラメータをプラットフォーム型にしない
    @PurelyImplements("kotlin.collections.MutableList")
    public class MyPureList extends AbstractList { ... }
    ■Kotlinから実行
    MyPureList().add(null) // NG アノテーション無しだとOKになってしまう
    MyPureList().add(null) // OK

    View full-size slide

  22. @JvmSynthetic
    ● 公式に説明が無い
    ● stack overflowで「I advice to not using it in normal "user"
    code.」と言われている。
    ○ https://goo.gl/Z1CSy

    View full-size slide