teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

実装例を追記

2018/09/04 18:13

投稿

nakasho_dev
nakasho_dev

スコア2655

answer CHANGED
@@ -5,4 +5,38 @@
5
5
  * [Android 開発の落とし穴:シングルトンのはずがいなくなる件](https://www.sglabs.jp/android-app-dev-for-java-developer/#%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%E3%83%88%E3%83%B3%E3%81%AE%E3%81%AF%E3%81%9A%E3%81%8C%E3%81%84%E3%81%AA%E3%81%8F%E3%81%AA%E3%82%8B%E4%BB%B6)
6
6
 
7
7
  最近ではDagger2を使ってSingletonクラスを注入するような設計も多くなってきたと思います。
8
- * [Dagger2 入門解説](https://qiita.com/MoyuruAizawa/items/26cb093adbc778013467)
8
+ * [Dagger2 入門解説](https://qiita.com/MoyuruAizawa/items/26cb093adbc778013467)
9
+
10
+
11
+ ### Singletonの実装例
12
+
13
+ 簡単なSingletonの実装例を示します。
14
+
15
+ ```Kotlin
16
+ class DataRepository private constructor() {
17
+ var userName: String? = null
18
+ var password: String? = null
19
+
20
+ companion object {
21
+ private var instance : DataRepository? = null
22
+
23
+ fun getInstance(): DataRepository {
24
+ if (instance == null)
25
+ instance = DataRepository()
26
+
27
+ return instance!!
28
+ }
29
+ }
30
+ }
31
+ ```
32
+
33
+ 上記のように作成し以下のような使い方ができます。
34
+ Applicationクラスのメンバ変数で保持しておけばガベージ対象にならないと考えます。
35
+
36
+ ```Kotlin
37
+ val repository = DataRepository.getInstance()
38
+ repository.userName = "hoge"
39
+ repository.password= "foo"
40
+ ```
41
+
42
+ ただ、この実装だと保存ができないので起動時にSharedPreferenceから保存しているUsernameとPasswordを取得して、UsernameとPasswordの更新があるたびにSharedPreferenceに書き込むという処理を実装したほうが良いと思います。