はじめに
VLC for Androidのリポジトリ周りのソースを見ているとSingletonHolderというクラスを見つけたので調べてみた。
各種リンク
ソースコード
↓。コンストラクで生成するクロージャを渡して、初回アクセス時はそれを使ってインスタンスを生成して渡すようにしているのがポイント。後はスレッドセーフを保証。
open class SingletonHolder<T, in A>(creator: (A) -> T) {
private var creator: ((A) -> T)? = creator
@Volatile var instance: T? = null
fun getInstance(arg: A) = instance ?: synchronized(this) {
val i2 = instance
if (i2 != null) i2
else {
val created = creator!!(arg)
instance = created
creator = null
created
}
}
}
他のアプリのソース
WIP
まとめ
別にこんなクラスはなくてもいいような気がするけど、ポカミスを避ける意味はあるのか?
後はDIを使いたくないとか。