![]() | Androidアプリ開発のためのKotlin実践プログラミング 新品価格 |

Kotlinでシングルトン作るならobjectで宣言する方法が取られる
ただしobjectで実装すると、初期化時に引数渡したい場合困る
今回はパラメーター渡してのシングルトンの書き方を調べてみた
・Java
Javaでよくあるシングルトン
public class BBB {
private static BBB ccc;
private BBB(@NonNull Context context) {
aaa = aaa(context)
}
public static BBB createInstance(@NonNull Context context) {
if (ccc == null) {
ccc = new BBB(context);
}
return ccc;
}
}
・Kotlin
調べたみたところ以下で書き換えるのが正攻法っぽい
class BBB private constructor(context: Context) {
init {
val aaa = aaa(context)
}
companion object {
@Volatile
private var ccc: BBB? = null
fun createInstance(context: Context): BBB =
ccc ?: synchronized(this) {
ccc ?: BBB(context).also { ccc = it }
}
}
}
Googleが書いたコードを参考にしました
https://stackoverflow.com/questions/40398072/singleton-with-parameter-in-kotlin
・Kotlinのコードの説明
init コンストラクタで初期化の処理
@Volatile writes to this field are immediately made visible to other threads
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/-volatile/index.html
synchronizedはlockだよね
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/synchronized.html
also 引数として受け取った値にしたいして関数を実行する
https://qiita.com/ngsw_taro/items/d29e3080d9fc8a38691e
これで一旦うまく行きましたとさ
Kotlin綺麗にかけるんだけど
Javaからの移行だと結構めんどくさいですね
まだまだ続くよ
タグ:java