当前位置: 首页 > news >正文

Android SharedPreferences 工具类封装:高效、简洁、易用

SharedPreferences 工具类封装:
1.支持泛型:通过泛型方法减少重复代码。

2.线程安全优化:使用双重检查锁定(Double-.Checked Locking)优化单例模式。

3.链式调用:支持链式调用,提升代码可读性。

4.默认值处理:提供更灵活的默认值处理方式。

5.代码简洁性:减少冗余代码,提升可维护性。

SharedPreferencesUtil 工具类代码

import android.content.Context;
import android.content.SharedPreferences;

public class SharedPreferencesUtil {

    private static final String PREF_NAME = "MyAppPreferences";
    private static volatile SharedPreferencesUtil instance;
    private final SharedPreferences sharedPreferences;
    private final SharedPreferences.Editor editor;

    private SharedPreferencesUtil(Context context) {
        sharedPreferences = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
        editor = sharedPreferences.edit();
    }

    /**
     * 获取单例实例(双重检查锁定,线程安全)
     */
    public static SharedPreferencesUtil getInstance(Context context) {
        if (instance == null) {
            synchronized (SharedPreferencesUtil.class) {
                if (instance == null) {
                    instance = new SharedPreferencesUtil(context.getApplicationContext());
                }
            }
        }
        return instance;
    }

    /**
     * 存储数据(支持链式调用)
     */
    public SharedPreferencesUtil put(String key, Object value) {
        if (value instanceof String) {
            editor.putString(key, (String) value);
        } else if (value instanceof Integer) {
            editor.putInt(key, (Integer) value);
        } else if (value instanceof Boolean) {
            editor.putBoolean(key, (Boolean) value);
        } else if (value instanceof Float) {
            editor.putFloat(key, (Float) value);
        } else if (value instanceof Long) {
            editor.putLong(key, (Long) value);
        } else {
            throw new IllegalArgumentException("Unsupported value type: " + value.getClass().getSimpleName());
        }
        editor.apply();
        return this;
    }

    /**
     * 获取数据(泛型方法,支持自动类型推断)
     */
    @SuppressWarnings("unchecked")
    public <T> T get(String key, T defaultValue) {
        if (defaultValue instanceof String) {
            return (T) sharedPreferences.getString(key, (String) defaultValue);
        } else if (defaultValue instanceof Integer) {
            return (T) Integer.valueOf(sharedPreferences.getInt(key, (Integer) defaultValue));
        } else if (defaultValue instanceof Boolean) {
            return (T) Boolean.valueOf(sharedPreferences.getBoolean(key, (Boolean) defaultValue));
        } else if (defaultValue instanceof Float) {
            return (T) Float.valueOf(sharedPreferences.getFloat(key, (Float) defaultValue));
        } else if (defaultValue instanceof Long) {
            return (T) Long.valueOf(sharedPreferences.getLong(key, (Long) defaultValue));
        } else {
            throw new IllegalArgumentException("Unsupported default value type: " + defaultValue.getClass().getSimpleName());
        }
    }

    /**
     * 删除指定键的数据
     */
    public SharedPreferencesUtil remove(String key) {
        editor.remove(key).apply();
        return this;
    }

    /**
     * 清空所有数据
     */
    public SharedPreferencesUtil clear() {
        editor.clear().apply();
        return this;
    }
}

使用示例

// 获取实例
SharedPreferencesUtil spUtil = SharedPreferencesUtil.getInstance(context);

// 存储数据(链式调用)
spUtil.put("username", "JohnDoe")
      .put("age", 25)
      .put("isLoggedIn", true);

// 读取数据(泛型方法,自动推断类型)
String username = spUtil.get("username", "defaultUsername");
int age = spUtil.get("age", 0);
boolean isLoggedIn = spUtil.get("isLoggedIn", false);

// 删除数据
spUtil.remove("username");

// 清空所有数据
spUtil.clear();

泛型支持

通过泛型方法 get,可以根据传入的默认值类型自动推断返回值类型,减少代码重复。

例如:spUtil.get(“age”, 0) 会自动返回 int 类型。

链式调用:

put、remove 和 clear 方法返回 this,支持链式调用,提升代码可读性。

线程安全优化:

使用双重检查锁定(Double-Checked Locking)确保单例模式的线程安全,同时避免不必要的同步开销。

默认值处理:

通过传入默认值的方式,避免在调用时额外处理空值问题。

代码简洁性:

减少冗余代码,提升工具类的可维护性和扩展性。

相关文章:

  • MySql数据库增删改查常用语句命令-MySQL步骤详解教程
  • Docker 的基本概念和优势,以及在应用程序开发中的实际应用
  • (十七) Nginx解析:架构设计、负载均衡实战与常见面试问题
  • windows环境下安装部署dify+本地知识库+线上模型
  • linux安装reids
  • 探索在直播中的面部吸引力预测新的基准和多模态方法
  • Git基础之分支
  • 观看文艺汇演问题
  • YC 孵化项目 Pinch:实时语音翻译视频会议平台;Mistral OCR:能处理多语言多模态复杂文档丨日报
  • 【Linux】详谈 基础I/O
  • linux学习(十)(磁盘和文件系统(索引节点,文件系统,添加磁盘,交换,LVM公司,挂载))
  • c语言笔记 函数参数的等价(上)
  • redis数据迁移教程(使用RedisShake实现不停机迁移十分便捷)
  • liunx学习(四)(文本处理(stdout stderr,Cut,paste,sort,tr,head,Tail,join,Split,grep,...))
  • OSI模型
  • 使用 QML 和 QtSql 实现 SQLite 数据库操作
  • FPGA基础 -- Verilog常用关键字
  • langChainv0.3学习笔记(初级篇)
  • mysql创建数据库和表
  • 【网络安全工程】任务11:路由器配置与静态路由配置
  • 西藏日喀则市拉孜县发生5.5级地震,震源深度10公里
  • 欧洲史上最严重停电事故敲响警钟:能源转型如何保证电网稳定?
  • 北上广深均宣布下调个人住房公积金贷款利率
  • 2025上海科技节将于5月17日开幕,拟设6大板块专题活动
  • 新华时评:任凭风云变幻,中俄关系从容前行
  • 公募基金行业迎系统性变革:基金公司业绩差必须少收费