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 Slide

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

    View Slide

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

    View Slide

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

    View Slide

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


    ● Throws


    これだけ書きました。

    View Slide

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


    ● Throws


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

    View Slide

  7. ● JvmField

    ● JvmName
    ● JvmOverloads

    ● JvmSuppressWildcards





    ● Throws


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

    View Slide

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

    View 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 Slide

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

    View 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 Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View 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 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 Slide

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

    View Slide