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

Transcript

  1. 2.

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

    • Monstar Lab, Inc. • Android Engineer • Twitter: @tebasakyu
  2. 4.

    • JvmField • JvmMultifileClass • JvmName • JvmOverloads • JvmStatic

    • JvmSuppressWildcards • JvmSynthetic • JvmWildcard • PurelyImplements • Strictfp • Synchronized • Throws • Transient • Volatile これで全部です。
  3. 5.

    • JvmField • JvmMultifileClass • JvmName • JvmOverloads • JvmStatic

    • JvmSuppressWildcards • JvmSynthetic • JvmWildcard • PurelyImplements • • • Throws • • これだけ書きました。
  4. 6.

    • JvmField • JvmMultifileClass • JvmName • JvmOverloads • JvmStatic

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

    • JvmField • • JvmName • JvmOverloads • • JvmSuppressWildcards

    • • • • • • Throws • • 今日はこの辺りを話します。
  6. 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.<拡張元クラス名>”などとしている場合、 下手に別名を付けると面倒なこともある。
  7. 10.

    @JvmOverloads • デフォルト値付き引数を持つメソッドのオーバーロードを生成 する @JvmOverloads fun hoge( bool: Boolean =

    false ) { } 生成されたJavaコード public void hoge() { hoge(false) } // アノテーションを付けないと出てこない。 public void hoge(boolean bool) { } // 無しの場合はこちらだけ。
  8. 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>だから)
  9. 12.

    @Throws • Kotlinから検査例外を明示させる ◦ Kotlinは検査例外が無いので、try-catchを強制できない class Hoge { @Throws(IOException::class) fun

    fuga() { throw IOException() } } ▪Javaから実行 hoge.fuga(); // コンパイルエラー(「try-catchしなさい」)
  10. 16.

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

    hoge = "fuga" // プロパティアクセス可 val fuga = "hoge" // getFuga() / setFuga() でアクセスする }
  11. 17.

    @JvmStatic • JavaからStatic呼び出しを可能にする companion object { @JvmStatic fun newInstance() :

    MainFragment = MainFragment() } ▪Javaから実行 アノテーションあり:MainFragment.newInstance(); アノテーションなし:MainFragment.Companion.newInstance();
  12. 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
  13. 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
  14. 22.

    @JvmSynthetic • 公式に説明が無い • stack overflowで「I advice to not using

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