はじめに
自分が作成しているアプリ(ZonePane、およびTwitPaneのMastodon機能)で使っている"ID"をLong型からString型に変更する必要があり、いくつかの段階を経て移行したのでその備忘録としてこの記事に残しておきます。
やりたいこと
data class AccountId(val value: Long)
を
data class AccountId(val value: String)
のように変えたい。
フェーズ1: 内部の型を String に変更する
data class AccountId(val rawValue: String) {
val value: Long get() = rawValue.toLong()
}
内部のデータ型のみ String
に変更しました。
toString
や equals
なども必要に応じて適宜修正します。
これでビルドするとインスタンス生成部分でエラーになるのでそこをいい感じに変更します。いわば setter の移行という形です。
AccountId(8192L), AccountId(user.id)
// ↓
AccountId(8192L.toString()), AccountId(user.id.toString())
フェーズ2: getterの移行
data class AccountId(val value: String) {
val valueAsLong: Long get() = value.toLong()
}
内部データも rawValue
ではなく value
に変更しました。これで値の使用箇所(getter)もString
型に移行する必要があります。実際の値としてもLong
型のまま使うことが保証できる部分(うちのアプリではTwitterのIDをそのまま保存するロジック)なら valueAsLong
を使ってもいいでしょう。
はまりどころ
JSONObject
やBundle
などはLong
の値をgetStringで取得してもほぼ問題ないんですが、SharedPreferences
は内部キャスト例外が発生するので別キーとして保存する必要がありました。
また、上記のフェーズ1からフェーズ2にかけて、Kotlinの謎のエラー(getValueがないなど)が発生して困りましたが、いわゆるビルドキャッシュをクリアすることで対処できました。