Kotlin移行1
- 2018.09.25
- Android
目的
- Javaで書かれたプロジェクトを少しずつKotlinで書き直す
- TestもKotlin化
- 備忘録的にちょこちょこ完了まで続ける
条件
- AndroidStudio3.1.4
- Java1.8.0_152
- Kotlin 1.2.70
- gradle 4.9
今回の作業範囲
- 某リリース済アプリのヘルプページ(単一Activity、他への影響度小さいと判断)をKotlin化
手順と具体的な作業
- 必要なプラグインを追加
app/build.gradle
1 2 3 4 |
apply plugin: 'kotlin-android' ... implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" |
build.gradle
1 2 3 4 5 6 7 |
ext.kotlin_version = '1.2.70' ... dependencies { classpath 'com.android.tools.build:gradle:3.1.4' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" .... |
-
IDEの機能を用いて一括置換
Code->Convert Java File to Kotlin Fileとすると開いているJava1ファイルがKotlinへ自動変換される -
一括置換で勝手に書き換わった他のファイルの内容確認
今回の実行範囲では、Activity内のstaticメソッドにアクセスしていたクラスの呼び出しに、Companionがついていた(実装上の問題とか色々あるけど後述の@JvmStaticをつけることで消せる) -
staticメソッドに@JvmStaticをつける
上記であげている、KotlinとJavaでのstaticメソッドの呼び方において、まずKotlinへの自動変換でJavaのstaticメソッドはCompanion Objectに書き換わる。
これをJavaからそのまま呼ぼうとすると、Companionが間に入ってしまうため、@JvmStaticをつけることでこれを回避(影響を受けたJavaファイルの修正は不要になる) -
ButterKnifeで@BindStringとしていた箇所を撤廃
strings.xmlの値をStringのクラス変数で定義できて便利だったが、同じものを同一クラス内で2度以上呼ぶのも稀だったため、Context経由で都度取得に変更。
具体的には
1 2 3 4 5 6 |
@BindString(R.string.siteUrl) String mSiteUrl; これをやめて、必要になった箇所で HogeApplication.getContext().getString(R.string.siteUrl) とした |
- 可能な限りvarをvalへ変更
自動変換すると、ButterknifeによるBind系はinternal var hoge: Buttonとかになっていたので
これらを初期化段階ですべてfindViewByIdでvalとして突っ込んだ
-
前の記事
AndroidでFatal Exception: java.lang.RuntimeException android.os.TransactionTooLargeException: data parcel size N bytes 2018.09.20
-
次の記事
RealmException XX is not part of the schema for this Realm 2018.09.27
コメントを書く