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

決戦Kotlinコンバート

 決戦Kotlinコンバート

Javaで書いてた人間が急にKotlinでコンバートした際のハマった事集です。

Takuya Ohashi

May 07, 2018
Tweet

More Decks by Takuya Ohashi

Other Decks in Technology

Transcript

  1. Icepickをandroid-stateに置き換え @Override public void onCreate(Bundle savedInstanceState) { Icepick.restoreInstanceState(this, savedInstanceState); }

    @Override public void onSaveInstanceState(Bundle outState) { Icepick.saveInstanceState(this, outState); } Before
  2. Icepickをandroid-stateに置き換え override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } override fun

    onSaveInstanceState(outState: Bundle?) { StateSaver.saveInstanceState(this, outState); } After
  3. 例えばこんなの val myTextView: TextView by lazy{ findViewById(R.id.my_text)} 参考:https://qiita.com/takahirom/items/49e18ec7084bb3b1937e 遅延初期化で利用できます。 が・・・。

    バックスタックで戻った際やTabLayoutなどで開きなおした後に値を差し変 たいのに見た目が変わらない。
  4. 対策 lateinit var myTextView : TextView … override fun onCreate(savedInstanceState:

    Bundle?) { super.onCreate(savedInstanceState) myButton = findViewById(R.id.my_text) 参考:https://qiita.com/takahirom/items/49e18ec7084bb3b1937e lateinitで実装するのが一般的のようです。
  5. Kotlin化が進んでくると class MyButton (context: Context) : android.support.v7.widget.AppCompatButton(context) { private var

    listener: MyBtClickListener? = null init { setOnClickListener { v -> listener?.onMyButtonClick(v.toString()) } } internal interface MyBtClickListener { fun onMyButtonClick(v: String) } //リスナーを追加するメソッド fun set MyBtClickListener(listener: MyBtClickListener) { this.listener = listener } } こんなクラスがあるとします。
  6. こういう書き方にできる private var listener:((v: String)->Unit)? = null init { setOnClickListener

    { v -> listener?.invoke(v.toString()) } } myButton.setMyListener{v->Log.d("hogehoge", v.toString())}. ビルドが通って思った通りに動きます。
  7. 例えばこんなの class Hoge{ private String param1; private String param2; public

    Hoge(String parm1, String param2){ this.param1 = param1; this.param2 = param2; } } Hoge hoge = new Hoge(param1, null); Javaであえてnullを渡している処理が書いてあった。 そもそもnullをあえて渡しているのもどうかと思う人も多いと思いますが、 コンバートした結果
  8. コンバート結果 class Hoge(val parm1: String, val param2: String) { }

    val hoge = Hoge(param1, null!!) !! を付与ることでNotNullに変換することができる