Kotlinのシングルトン・クラス
質問
Kotlinでシングルトンクラスを作成し、Utilクラスがアプリの実行ごとに一度だけインスタンス化する方法を知りたいです。しかし、Javaクラスをkotlinに変換したところ、以下のようなコードが生成されました。
これは正しいのでしょうか?
companion object {
private var utilProject: UtilProject? = null
val instance: UtilProject
get() {
if (utilProject == null) utilProject = UtilProject()
return utilProject!!
}
}
関連する 質問 が、それはパラメータ付きであり、私はそれがパラメータなしで変換されていない取得しています。
どのように解決するのですか?
ただ
companion object {
val instance = UtilProject()
}
はその役割を果たします。
コンパニオンオブジェクト
自体が言語レベルのシングルトンであるためです。
(その
instance
はコンパニオンオブジェクトが
最初
が呼び出されたときに作成されます)。
-- 更新された --
シングルトンオブジェクトが初期化されるタイミングを制御する必要がある場合、各クラスに対して1つのオブジェクトを作成することができます。
class UtilProject {
....
companion object {
val instance = UtilProject()
}
}
class AnotherClass {
...
companion object {
val instance = AnotherClass()
const val abc = "ABC"
}
}
fun main(args: Array<String>) {
val a = UtilProject.instance // UtilProject.instance will be initialized here.
val b = AnotherClass.abc // AnotherClass.instance will be initialized here because AnotherClass's companion object is instantiated.
val c = AnotherClass.instance
}
ここで
AnotherClass.instance
が初期化される前に
AnotherClass.instance
が実際に呼ばれる前に初期化されます。初期化されるのは
AnotherClass
のコンパニオン・オブジェクトが呼ばれたときに初期化されます。
必要なときに先に初期化されないようにするには、次のようにすればよい。
class UtilProject {
....
companion object {
fun f() = ...
}
}
class AnotherClass {
...
companion object {
const val abc = "ABC"
}
}
object UtilProjectSingleton {
val instance = UtilProject()
}
object AnotherClassSingleton {
val instance = AnotherClass()
}
fun main(args: Array<String>) {
UtilProject.f()
println(AnotherClass.abc)
val a = UtilProjectSingleton.instance // UtilProjectSingleton.instance will be initialized here.
val b = AnotherClassSingleton.instance // AnotherClassSingleton.instance will be initialized here.
val c = UtilProjectSingleton.instance // c is a.
}
各シングルトンの初期化タイミングを気にしないのであれば、このような使い方も可能です。
class UtilProject {
....
companion object {
fun f() = ...
}
}
class AnotherClass {
...
companion object {
const val abc = "ABC"
}
}
object Singletons {
val utilProject = UtilProject()
val anotherClass = AnotherClass()
}
fun main(args: Array<String>) {
val a = Singletons.utilProject
val b = Singletons.anotherClass
}
まとめると
an
object
または
companion object
はKotlinでは1つのシングルトンオブジェクトです。
の中に変数を代入することができます。
オブジェクト
または
オブジェクト
で、その変数をシングルトンと同じように使用します。
object
または
companion object
は最初に使われるときにインスタンス化されます。
val
と
var
の中に
object
が初期化されるとき
object
が最初にインスタンス化されたとき (すなわち
object
が最初に使われたとき)。
関連
-
[解決済み] Kotlin 三項条件演算子
-
[解決済み】KotlinでJavaの静的メソッドに相当するものは何ですか?
-
[解決済み] android: imageview の画像を画面に合わせて伸縮させる
-
[解決済み] Android Studio - あいまいなメソッド呼び出し getClass()
-
[解決済み] バイト配列の画像ファイルをビットマップに変換するには?
-
[解決済み] FloatingActionButtonのサンプルとサポートライブラリ
-
[解決済み] proguard hell - 参照されているクラスが見つかりません。
-
[解決済み] HttpURLConnectionを使ったPOSTによるファイル送信
-
[解決済み] <string> XMLで改行やタブを作るには(eclipse/android)?
-
[解決済み] Kotlinのパラメータ付きシングルトン
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Android Webview - キャッシュを完全に削除する
-
[解決済み] プログラム的に電話をかけるには?
-
[解決済み] 「KotlinとAndroidで「パラメータTを推測するのに十分な情報がありません。
-
[解決済み] DialogFragmentを正しく終了させるには?
-
[解決済み] Gmailの3分割アニメーションシナリオの完全動作サンプル?
-
[解決済み] 非ActivityクラスでContextを取得する [重複].
-
[解決済み] Androidアプリケーションのヒープサイズを大きくするには?
-
[解決済み] BottomNavigationViewを新しいNavControllerで使用する際に、フラグメントを生かす方法はありますか?
-
[解決済み] 文字列リソースにHTML?
-
[解決済み] Kotlinのパラメータ付きシングルトン