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. 自己紹介 • 鈴木 誠 (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