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

Annotations specific to the Java platform.

Annotations specific to the Java platform.

Avatar for tebasakyu

tebasakyu

August 22, 2017

More Decks by tebasakyu

Other Decks in Programming

Transcript

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

    • Monstar Lab, Inc. • Android Engineer • Twitter: @tebasakyu
  2. • JvmField • JvmMultifileClass • JvmName • JvmOverloads • JvmStatic

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

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

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

    • • • • • • Throws • • 今日はこの辺りを話します。
  6. 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. @JvmOverloads • デフォルト値付き引数を持つメソッドのオーバーロードを生成 する @JvmOverloads fun hoge( bool: Boolean =

    false ) { } 生成されたJavaコード public void hoge() { hoge(false) } // アノテーションを付けないと出てこない。 public void hoge(boolean bool) { } // 無しの場合はこちらだけ。
  8. @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. @Throws • Kotlinから検査例外を明示させる ◦ Kotlinは検査例外が無いので、try-catchを強制できない class Hoge { @Throws(IOException::class) fun

    fuga() { throw IOException() } } ▪Javaから実行 hoge.fuga(); // コンパイルエラー(「try-catchしなさい」)
  10. @JvmField • プロパティアクセスを可能にする ◦ 通常はgetter/setterを介してアクセスさせる class data { @JvmField val

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

    MainFragment = MainFragment() } ▪Javaから実行 アノテーションあり:MainFragment.newInstance(); アノテーションなし:MainFragment.Companion.newInstance();
  12. @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. @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. @JvmSynthetic • 公式に説明が無い • stack overflowで「I advice to not using

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