Kotlin委托优化SharedPreferences存储
2020-09-24 本文已影响0人
JingChen_
分享下最近优化的关于SP存储的代码
private var test by Test("123")
class Test(val key:String){
operator fun getValue(any: Any, property: KProperty<*>): Any {
return SharedPreferencesUtil.getInstance().get(key,"")
}
operator fun setValue(any: Any, property: KProperty<*>, value: Any) {
SharedPreferencesUtil.getInstance().put(key,value)
}
}
这里用到了Kotlin的委托模式
在这里我们先写好一个SP的工具类
public class SharedPreferencesUtil {
private static SharedPreferencesUtil instance;
private SharedPreferences.Editor editor;
private SharedPreferences prefer;
@SuppressLint("CommitPrefEdits")
private SharedPreferencesUtil() {
this.prefer = PreferenceManager.getDefaultSharedPreferences(BaseApplication.getAppContext());
this.editor = this.prefer.edit();
}
public static SharedPreferencesUtil getInstance() {
if (instance == null) {
synchronized (SharedPreferencesUtil.class) {
if (instance == null) {
instance = new SharedPreferencesUtil();
}
}
}
return instance;
}
//存入sp
public void put(String name, Object data) {
if(data instanceof String){
this.editor.putString(name, (String) data);
}else if(data instanceof Integer){
this.editor.putInt(name, (Integer) data);
}else if(data instanceof Boolean){
this.editor.putBoolean(name, (Boolean) data);
}else if(data instanceof Float){
this.editor.putFloat(name, (Float) data);
}else if(data instanceof Long){
this.editor.putLong(name, (Long) data);
}else{
if (data != null) {
this.editor.putString(name, data.toString());
}
}
this.editor.apply();
}
//获取sp
public Object get(String key, Object defaultObject) {
if(defaultObject instanceof String) {
return this.prefer.getString(key, (String) defaultObject);
}else if(defaultObject instanceof Integer){
return this.prefer.getInt(key, (Integer) defaultObject);
}else if(defaultObject instanceof Float){
return this.prefer.getFloat(key, (Float) defaultObject);
}else if(defaultObject instanceof Boolean){
return this.prefer.getBoolean(key, (Boolean) defaultObject);
}else if(defaultObject instanceof Long){
return this.prefer.getLong(key, (Long) defaultObject);
}
return null;
}
/**
* 移除某个key值对应的值
* */
public void remove(String key){
this.editor.remove(key);
this.editor.apply();
}
/**
* 清除所有的内容
*
* */
public void clear(){
this.editor.clear();
this.editor.apply();
}
/**
* 查询某个key是否存在
* */
public boolean contains(String key){
return this.prefer.contains(key);
}
}
刚才用var定义的test变量,用by关键字委托给Test(),属性的 get() 方法(以及set() 方法)将被委托给这个对象的 getValue() 和 setValue() 方法。属性委托不必实现任何接口, 但必须提供 getValue() 函数(对于 var属性,还需要 setValue() 函数)。
class Test(val key:String){
operator fun getValue(any: Any, property: KProperty<*>): Any {
return SharedPreferencesUtil.getInstance().get(key,"")
}
operator fun setValue(any: Any, property: KProperty<*>, value: Any) {
SharedPreferencesUtil.getInstance().put(key,value)
}
}
test变量调用getValue()方法,假如SP中已经存了刚才传进来的"123"key值,就直接取到对应的值,如果没有,就给定设定好的默认值""。这样做的好处是,当我要去系统中取到之前已经存储的东西,不用每次都调用SharedPreferencesUtil.getInstance().get(key,""),当我们去个他设定一个值时,就调用了setValue方法,传进来的值就是参数value,然后通过SP的存方式存在缓存中。通过委托的方式直接传值取值,使得代码简洁许多。