2017-08-16 15 views
3

SharedPreferencesを処理するためのより簡単な方法を作成したいと思います。コンストラクタの可視性がファイルに限定されています

val email = SharedPrefs.userdata.email 
val wifiOnly = SharedPrefs.connections.wifiOnly 

セットの好み:

SharedPrefs.userdata.email = "[email protected]" 
SharedPrefs.connections.wifiOnly = true 

私はこのように、そうすることができるよ:

App.instanceをこの

は好みを得るように私はそれを呼びたい 方法があります次のスニペットのContextオブジェクトを返します

object SharedPrefs { 

    val userdata by lazy { UserPreferences() } 
    val connections by lazy { ConnectionPreferences() } 

    class UserPreferences { 

     private val prefs: SharedPreferences = App.instance.getSharedPreferences("userdata", Context.MODE_PRIVATE) 

     var email: String 
      get() = prefs.getString("email", null) 
      set(value) = prefs.edit().putString("email", value).apply() 
    } 

    class ConnectionPreferences { 

     private val prefs: SharedPreferences = App.instance.getSharedPreferences("connections", Context.MODE_PRIVATE) 

     var wifyOnly: Boolean 
      get() = prefs.getBoolean("wifiOnly", false) 
      set(value) = prefs.edit().putBoolean("wifyOnly", value).apply() 
    } 

} 

これはまだ呼び出すことができます:SharedPrefs.UserPreferences() このコンストラクタをこのファイルまたはオブジェクトに対してのみプライベートにすることはできますか?

答えて

3

です:

object SharedPrefs { 
    val userdata: UserPreferences by lazy { UserPreferencesImpl() } 

    interface UserPreferences { 
     var email: String 
    } 

    private class UserPreferencesImpl : UserPreferences { 
     private val prefs: SharedPreferences = 
      App.instance.getSharedPreferences("userdata", Context.MODE_PRIVATE) 

     override var email: String 
      get() = prefs.getString("email", null) 
      set(value) = prefs.edit().putString("email", value).apply() 
    } 


    // ... 
} 

また、ライブラリを開発している場合や、モジュラーアーキテクチャを使用している場合は、internal visibility修飾子を使用してモジュールへの可視性を制限する:

class UserPreferences internal constructor() { /* ... */ } 
+0

これは私の必要と同じように機能します。あまりにも多くのコーディングが必要です – dumazy

-1

あなたはこの

class UserPreferences private constructor() 
{ 
    // your impl 
} 

Thisような何かを試すことができますあなたはインタフェースと実装クラスを分離し、そしてオブジェクトに後者privateを作ることができます参照

+0

これにより、上位オブジェクトSharedPrefsに到達できなくなります。 ''にアクセスできない:UserPreferencesのprivateである。 – dumazy

+0

'private'を' internal'に置き換えると、同じモジュール内でのみ可視になります。しかし、これはあなたのニーズに完全に適合しません。 – FreshD

関連する問題