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

Annotations specific to the Java platform.

122ec46444f145d8253582a7cade5f4f?s=47 tebasakyu
August 22, 2017

Annotations specific to the Java platform.

122ec46444f145d8253582a7cade5f4f?s=128

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

  2. 自己紹介 • 鈴木 誠 (Makoto Suzuki) ◦ 娘: 遙華(Haruka) 5ヶ月

    • Monstar Lab, Inc. • Android Engineer • Twitter: @tebasakyu
  3. Annotations 公式リファレンス https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/index.html#annotations • Javaとの相互運用には欠かせないもの ◦ 100%Kotlinなら不要 ◦ KotlinからJavaへの優しさ

  4. • JvmField • JvmMultifileClass • JvmName • JvmOverloads • JvmStatic

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

    • JvmSuppressWildcards • JvmSynthetic • JvmWildcard • PurelyImplements • • • Throws • • これだけ書きました。
  6. • JvmField • JvmMultifileClass • JvmName • JvmOverloads • JvmStatic

    • JvmSuppressWildcards • JvmSynthetic • JvmWildcard • PurelyImplements • • • Throws • • よく使いそうなのはこの辺りですね。
  7. • JvmField • • JvmName • JvmOverloads • • JvmSuppressWildcards

    • • • • • • Throws • • 今日はこの辺りを話します。
  8. @JvmName • クラス名、メソッド名にJavaからの実行用別名をつける View.kt @file:JvmName("View") package com.xxx.extensions fun View.toVisible() {

    this.visibility = View.VISIBLE }
  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.<拡張元クラス名>”などとしている場合、 下手に別名を付けると面倒なこともある。
  10. @JvmOverloads • デフォルト値付き引数を持つメソッドのオーバーロードを生成 する @JvmOverloads fun hoge( bool: Boolean =

    false ) { } 生成されたJavaコード public void hoge() { hoge(false) } // アノテーションを付けないと出てこない。 public void hoge(boolean bool) { } // 無しの場合はこちらだけ。
  11. @JvmSuppressWildcards • ジェネリクスのワイルドカードを利用不可にする interface Foo class Bar: Foo { fun

    hoge(list: List<@JvmSuppressWildcards Foo>) { } } ▪Javaから実行する new Bar().hoge(new ArrayList<Foo>()); // OK new Bar().hoge(new ArrayList<Bar>()); // NG (Barは<? extends Foo>だから)
  12. @Throws • Kotlinから検査例外を明示させる ◦ Kotlinは検査例外が無いので、try-catchを強制できない class Hoge { @Throws(IOException::class) fun

    fuga() { throw IOException() } } ▪Javaから実行 hoge.fuga(); // コンパイルエラー(「try-catchしなさい」)
  13. 相互運用せざるをえない人たちも居ます。 そんな人たちに出会ったとき、これらのアノテーションを思い出し てあげてください。 きっと救われます。

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

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

  16. @JvmField • プロパティアクセスを可能にする ◦ 通常はgetter/setterを介してアクセスさせる class data { @JvmField val

    hoge = "fuga" // プロパティアクセス可 val fuga = "hoge" // getFuga() / setFuga() でアクセスする }
  17. @JvmStatic • JavaからStatic呼び出しを可能にする companion object { @JvmStatic fun newInstance() :

    MainFragment = MainFragment() } ▪Javaから実行 アノテーションあり:MainFragment.newInstance(); アノテーションなし:MainFragment.Companion.newInstance();
  18. @JvmMultifileClass • 複数ファイルにまたがって同一の”JvmName”を利用する Hoge.kt @file:JvmName("Util") @JvmMultifileClass package com.xxx fun hoge()

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

    com.xxx.Util.hoge(); com.xxx.Util.fuga();
  20. @JvmWildcard • ジェネリクスのワイルドカードをつける ◦ List<String> → List<? extends String> ◦

    不要な場合(finalなど)、デフォルトでワイルドカード無しに なる fun foo(l: List<String>) // in Java: List<String> (String is final) fun foo(l: List<@JvmWildcard String>) // in Java: List<? extends String> 引用元:https://goo.gl/ETK3Sm
  21. @PurelyImplements • Java側がKotlinのために付ける(っぽい) • 型パラメータをプラットフォーム型にしない @PurelyImplements("kotlin.collections.MutableList") public class MyPureList<T> extends

    AbstractList<T> { ... } ▪Kotlinから実行 MyPureList<Int>().add(null) // NG アノテーション無しだとOKになってしまう MyPureList<Int?>().add(null) // OK
  22. @JvmSynthetic • 公式に説明が無い • stack overflowで「I advice to not using

    it in normal "user" code.」と言われている。 ◦ https://goo.gl/Z1CSy