Kotlin移行2
- 2018.10.02
- Android
目的
- Javaで書かれたプロジェクトを少しずつKotlinで書き直す
- TestもKotlin化
- 備忘録的にちょこちょこ完了まで続ける
条件
- AndroidStudio3.1.4
- Java1.8.0_152
- Kotlin 1.2.70
- gradle 4.9
今回の作業範囲
- 某リリース済アプリのとあるModelクラスをKotlin化
前提
- 解析用モデルクラスとして10クラスほどあり、全てベースのModelクラスを継承している
- ベースのModelクラスには全解析パラメータが記述されている
- 継承先Modelクラスでは、扱う値は全てNonNullとしている
- Builderパターンをlombokで実装している
- DataBindingで実装中のため、lombokを廃止する必要がある
手順と具体的な作業
継承元はopenなclassにする
Before: BaseTracking.java
1 2 3 4 5 6 |
abstract class BaseTracking { public String a = null; public Integer b = null; public String c = null; } |
After: BaseTracking.kt
1 2 3 4 5 6 |
open abstract class BaseTracking { open val a: String? = null open val b: Int? = null open var c: String? = null } |
継承先のModelクラスをdata classにする
Before: HogeTracking.java
1 2 3 4 5 6 7 8 9 10 11 12 |
@Builder public class HogeTracking extends BaseTracking { @NonNull public String a; @Override public HogeTracking rebuild() { super.a = a; return this; } } |
After: HogeTracking.kt
1 2 |
data class HogeTracking(override val a: String) : BaseTracking() |
まとめ
data classの継承に関しては色々調べると、interfaceがよいという記事があり参考になった。
しかし今回の要件として、Tracking内容は一律毎回同じ要素数を送る、ということだったのでinterfaceで宣言してしまうと、
継承先で全ての要素を定義しないとならなくて冗長になってしまうので、BaseTrackingクラスは上記の形に落ち着きました。
Kotlinのoverride valのおかげで、NonNull要件を満たし、Javaでrebuildしてsuper.aにわざわざ突っ込み直す必要がなくなってすっきり。
lombok撤廃できたがJava混在中なので、BuilderパターンのJava呼び出し箇所は書き換えざるを得なかった。
参考リンク
http://y-anz-m.blogspot.com/2017/07/kotlin-data-class-interface.html
http://exception-think.hatenablog.com/entry/20170812/1502474400
https://qiita.com/ngsw_taro/items/75cdd8034bfd09abd29f
-
前の記事
RealmException XX is not part of the schema for this Realm 2018.09.27
-
次の記事
importにcannot resolve symbol 2018.10.03
コメントを書く