创建单例类

.h文件

///创建单例类
+ (instancetype)sharedInstance;
+ (instancetype) alloc __attribute__((unavailable("call sharedInstance instead")));
+ (instancetype) new __attribute__((unavailable("call sharedInstance instead")));
- (instancetype) copy __attribute__((unavailable("call sharedInstance instead")));
- (instancetype) mutableCopy __attribute__((unavailable("call sharedInstance instead")));
复制代码

.m文件

///单例类
+ (instancetype)sharedInstance{
    
    static POrderGoodsInfoManager *manager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        manager = [[super allocWithZone:NULL] init];
    });
    return manager;
}
复制代码
<think>好的,用户想知道如何在Android Studio中使用Java或Kotlin创建单例类。我需要先回顾单例模式的基本概念,确保用户理解其用途。然后,分别针对Java和Kotlin给出实现方法,因为用户可能对两种语言都有需求。 首先,单例模式的核心是确保一个类只有一个实例,并提供全局访问点。在Java中,常见的实现方式有懒汉式、饿汉式、双重检查锁等。需要提到线程安全的问题,尤其是多线程环境下如何保证单例的唯一性。例如,双重检查锁在Java中需要volatile关键字来防止指令重排序,确保实例的正确初始化。 对于Kotlin,实现单例更简单,因为Kotlin提供了object关键字,可以直接声明单例类。但用户可能需要更灵活的方式,比如带参数的单例,这时候可以使用伴生对象和lazy初始化。同时,引用中的例子提到了使用伴生对象和synchronized来实现双重检查锁,需要详细说明这种方法,特别是如何处理带参数的初始化。 还需要考虑用户可能遇到的常见问题,比如性能优化、线程安全、初始化时机等。在回答中应对比两种语言的实现差异,帮助用户根据项目需求选择合适的方案。例如,Kotlin的object是饿汉式,而使用伴生对象和lazy可以实现懒汉式。 另外,用户提供的引用中有关于在Kotlin中添加属性的例子,应该包含进来,展示如何创建带参数的单例类。这可能对用户的实际应用有帮助,尤其是在需要动态初始化单例实例的情况下。 最后,生成的相关问题需要涵盖单例模式的线程安全、选择语言实现的考虑因素、初始化方式以及常见问题排查,这样用户可以有进一步学习的路径。确保回答结构清晰,分步骤说明每种实现方式,并提供代码示例,便于用户直接应用。</think>### 如何在 Android Studio 中创建单例类 #### 一、单例模式核心要求 1. **唯一实例**:全局仅存在一个实例 2. **全局访问点**:提供统一的实例获取方式 3. **线程安全**:多线程环境下保证初始化正确性 #### 二、Java 实现方案 ##### 1. 双重检查锁(推荐线程安全方案) ```java public class Singleton { // volatile 保证可见性与有序性 private static volatile Singleton instance; // 私有化构造方法 private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } } ``` **特点**:延迟初始化 + 高效同步控制[^4] ##### 2. 静态内部类方案 ```java public class Singleton { private Singleton() {} private static class Holder { static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return Holder.INSTANCE; } } ``` **特点**:利用类加载机制保证线程安全[^4] #### 三、Kotlin 实现方案 ##### 1. 原生 object 声明(饿汉式) ```kotlin object Singleton { fun showMessage() = "Hello Singleton" } ``` **调用方式**:`Singleton.showMessage()` **特点**:线程安全,类加载时初始化[^3] ##### 2. 带参数的双重检查锁(延迟初始化) ```kotlin class Singleton private constructor(private val config: String) { companion object { @Volatile private var instance: Singleton? = null fun getInstance(config: String): Singleton = instance ?: synchronized(this) { instance ?: Singleton(config).also { instance = it } } } } ``` **特点**:支持参数传递 + 线程安全[^4] ##### 3. 使用 lazy 委托 ```kotlin class Singleton private constructor() { companion object { val instance: Singleton by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { Singleton() } } } ``` **特点**:简洁语法 + 灵活选择线程安全模式[^3] #### 四、Android Studio 操作步骤 1. **创建类文件**:右键包名 → New → Kotlin Class/Java Class 2. **选择实现模式**:根据需求选择上述任一代码模板 3. **验证单例特性**:通过`System.identityHashCode()`检查实例地址 #### 五、选择建议 | 场景 | Java 推荐方案 | Kotlin 推荐方案 | |--------------------|-------------------|---------------------| | 简单单例 | 静态内部类 | object 声明 | | 需要延迟初始化 | 双重检查锁 | lazy 委托 | | 带初始化参数 | 工厂方法模式 | 伴生对象+双重检查锁 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值