Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
決戦Kotlinコンバート
Search
Takuya Ohashi
May 07, 2018
Technology
500
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
決戦Kotlinコンバート
Javaで書いてた人間が急にKotlinでコンバートした際のハマった事集です。
Takuya Ohashi
May 07, 2018
More Decks by Takuya Ohashi
See All by Takuya Ohashi
冴えない彼女の育て方から学ぶ情熱と合理性の使い分け
pg0084
0
560
モバイルアプリでの Amazon Cognito のすゝめ
pg0084
2
550
Android近距離通信のあれこれ
pg0084
0
550
Other Decks in Technology
See All in Technology
20260912_スクラムにジェネラリストは必要か
ryugen04
0
380
山手線を徒歩で一周してわかった、 位置情報アプリは「足」が最強のデバッガー
hinakko
0
120
[2026-09-11]SREは誰のもの?運用エンジニアが始める 「SRE領域への越境」とチームの進化の軌跡 〜Road to NEXT CRE
tosite
0
170
omasushiというライブラリを作った
polidog
PRO
0
210
NW運用でNWトポロジ可視化ツールに期待すること/shumoku-meetup1
corestate55
2
120
目の前の楽しいが人生を変える - コミュニティの螺旋の歩き方と楽しむコツ / change your life
soudai
PRO
4
530
#jawssonic2026 あの時代が悪かった ~動かなかったSageMakerと共に迎えたイベント当日~
ktkn1129
0
150
AI時代の「技術的負債」の変質ー概念の終焉と再解釈、エージェントと共に向かう先
nwiizo
0
180
OpenTelemetryのメトリクスをCloudWatchに送ってPromQLで見てみた
ota1022
0
130
多層防御と最⼩権限で実現する、安全なAIエージェント設計パターン
lycorptech_jp
PRO
1
280
Slack上でインフラをトラブルシュートする! Agentic Platform Engineeringの第一歩
teru0x1
4
1.5k
Reactの設計論
uhyo
15
8.6k
Featured
See All Featured
How STYLIGHT went responsive
nonsquared
100
6.3k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
240
What's in a price? How to price your products and services
michaelherold
247
13k
Discover your Explorer Soul
emna__ayadi
2
1.3k
Context Engineering - Making Every Token Count
addyosmani
9
1.1k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
700
We Are The Robots
honzajavorek
0
360
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
A better future with KSS
kneath
240
18k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
Automating Front-end Workflow
addyosmani
1369
210k
Transcript
決戦Kotlinコンバート MobileAct osaka #4 @pg0084
自己紹介 ・オオハシタクヤ @pg0084 ・フェンリルに所属 Androidエンジニア ・趣味はマクドナルド
2月8日DroidKaigi2018 最高カンファレンスでした。
しかし・・・。
Kotlinを知らない Androidアプリエンジニアに 人権がない!!
ということでJavaのプロジェクトを Kotlinコンバートしてみた
Javaファイル数約560
今回は約500ファイルをコンバート 将来的には全Kotlin化を目指します。
目次 1. kaptでビルドが通らない?Lombokの罠! 2. IcepickがKotlinに対応していない件につきまして 3. Interfaceの実装方法がバラバラだと困るSAM変換 4.値が更新されない?by lazyでfindVIew 5.コメントが入れ子にできる仕様で30秒思考停止
6.気の利いた謎のコンバート
Kaptでビルドが通らない? Lombokの罠!
Lombokとは アノテーションを付けるだけで、 getterやsetter、コンストラクターまで生 成してくれる便利ライブラリ。 @Getter @Setter @Data @AllArgsConstructor など
kaptとLombok の相性が悪いらしく Lombok で実装しているクラスのメンバはprivateなのでSetter、Getter にアクセスできないと言われ、ビルドエラーに。 ※この段階ではまだ1ファイルもコンバートしていません。 原因
とった策 将来的に全Kotlin化を想定しているのでLombokのアノテーションを全て外す Lombokを使っているクラスだけで300近くあるから手動は大変! delombokが便利! lombok.jarを使って以下のようなコマンドを打つだけ! 念のために別ディレクトリにdelombokされたファイルを出力します。 java -jar lombok.jar delombok
-f pretty {対象ディレクトリ} -d {出力先ディレクトリ}
Icepickが対応していない件につきまして
Icepickとは AndroidではActivityなどの破棄により、入力した値が破棄される。 状態の保存/復元をサポートするアノテーションライブラリ。 保持したい変数に@Stateをつけ、saveInstanceStateと restoreInstanceStateを呼んであげるだけ! 超便利なライブラリ。 Kotlinだと@JvmField アノテーションをつけないと動作しない! setter/getterではないField変数をそのまま公開しないといけなくなる ので何とも言えない気持ちになる
Icepickをandroid-stateに置き換え @Override public void onCreate(Bundle savedInstanceState) { Icepick.restoreInstanceState(this, savedInstanceState); }
@Override public void onSaveInstanceState(Bundle outState) { Icepick.saveInstanceState(this, outState); } Before
Icepickをandroid-stateに置き換え override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } override fun
onSaveInstanceState(outState: Bundle?) { StateSaver.saveInstanceState(this, outState); } After
値が更新されない? by lazyでfindview
例えばこんなの val myTextView: TextView by lazy{ findViewById(R.id.my_text)} 参考:https://qiita.com/takahirom/items/49e18ec7084bb3b1937e 遅延初期化で利用できます。 が・・・。
バックスタックで戻った際やTabLayoutなどで開きなおした後に値を差し変 たいのに見た目が変わらない。
対策 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で実装するのが一般的のようです。
実装方法がバラバラだと困るinterfaceとSAM変換
SAM変換って? SAMとはSingle Abstract Methodの略で、SAMインターフェースは、 一つだけ抽象メソッドをもつインターフェースです。 button.setOnClickListener(object: View.OnClickListener { public override
fun onClick(v: View) { Log.v(TAG, "clicked") } });} button.setOnClickListener{ v -> Log.v(TAG, "clicked") } 下のように記述できる
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 } } こんなクラスがあるとします。
呼び出し方 Interfaceも呼び出す側もKotlinの場合 myButton.setMyListener{v->Log.d("hogehoge", v.toString())}. ビルドエラーになります。
こういう書き方にできる private var listener:((v: String)->Unit)? = null init { setOnClickListener
{ v -> listener?.invoke(v.toString()) } } myButton.setMyListener{v->Log.d("hogehoge", v.toString())}. ビルドが通って思った通りに動きます。
実装の仕方がバラバラだとハマる可能性 同じinterfaceを実装している場合、2パターンの実装している場合もあ る。 コンバートした後にinterfaceのまま残すか、関数型にして実装方法を 統一しなくてはいけない。 class MainActivity : AppCompatActivity(),MyButton.MyBtClickListener{ override
fun onMyButtonClick(v: View) { Log.d("hogehoge", v.toString()) } myButton.setMyListener{v->Log.d("hogehoge", v.toString())}.
コメントが入れ子にできる仕様で 30秒くらいフリーズした話
Kotlinではブロックコメントが入れ子にできる 入れ子になっていることにぱっと見気がつかない コメントで /*.XML とか書いてあったらコンバート後に間違い探しが発生!30秒思考 停止。 /** * /src/layout/*.xml */
Class MainActivity: AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) }
気の利いた謎のコンバート
例えばこんなの 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をあえて渡しているのもどうかと思う人も多いと思いますが、 コンバートした結果
コンバート結果 class Hoge(val parm1: String, val param2: String) { }
val hoge = Hoge(param1, null!!) !! を付与ることでNotNullに変換することができる
null!!
まとめ Kotlinコンバートは思ったより手間がかかる
ご清聴ありがとうございました