LoginSignup
0
0

More than 1 year has passed since last update.

Kotlin で Long 型のプロパティを String 型に移行したときの備忘録

Posted at

はじめに

自分が作成しているアプリ(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 に変更しました。

toStringequals なども必要に応じて適宜修正します。

これでビルドするとインスタンス生成部分でエラーになるのでそこをいい感じに変更します。いわば 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 を使ってもいいでしょう。

はまりどころ

JSONObjectBundleなどはLongの値をgetStringで取得してもほぼ問題ないんですが、SharedPreferencesは内部キャスト例外が発生するので別キーとして保存する必要がありました。

また、上記のフェーズ1からフェーズ2にかけて、Kotlinの謎のエラー(getValueがないなど)が発生して困りましたが、いわゆるビルドキャッシュをクリアすることで対処できました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0