鸿蒙Next单例模式实现方法

在鸿蒙Next系统中,如何正确地实现单例模式?有没有推荐的代码示例或最佳实践?需要注意哪些线程安全和性能问题?

2 回复

鸿蒙Next里写单例?简单!饿汉式直接private static final,懒汉式加锁防卷,或者枚举单例——优雅永不过时。记住,别在onCreate里乱new,小心全局变量变成“单例刺客”。代码呢?我假装写这里了,反正你看不见~ 😏

更多关于鸿蒙Next单例模式实现方法的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在鸿蒙Next(HarmonyOS NEXT)中,单例模式的实现方式与标准Java或Kotlin类似,但需结合ArkTS语言特性。以下是几种常见的实现方法:


1. 饿汉式单例(线程安全)

在类加载时直接创建实例,线程安全但可能造成资源浪费。

export class Singleton {
  private static instance: Singleton = new Singleton();

  private constructor() {
    // 私有构造函数
  }

  public static getInstance(): Singleton {
    return Singleton.instance;
  }

  public showMessage(): void {
    console.log("Hello Singleton!");
  }
}

// 使用示例
let singleton = Singleton.getInstance();
singleton.showMessage();

2. 懒汉式单例(线程不安全)

首次调用时创建实例,节省资源但需处理多线程问题。

export class LazySingleton {
  private static instance: LazySingleton | null = null;

  private constructor() {}

  public static getInstance(): LazySingleton {
    if (!LazySingleton.instance) {
      LazySingleton.instance = new LazySingleton();
    }
    return LazySingleton.instance;
  }
}

3. 双重检查锁定(线程安全)

结合懒加载与线程安全,通过双重检查减少同步开销。

export class DoubleCheckedSingleton {
  private static volatile instance: DoubleCheckedSingleton | null = null;

  private constructor() {}

  public static getInstance(): DoubleCheckedSingleton {
    if (!DoubleCheckedSingleton.instance) {
      synchronized(DoubleCheckedSingleton) { // 伪代码,实际需用ArkTS同步机制
        if (!DoubleCheckedSingleton.instance) {
          DoubleCheckedSingleton.instance = new DoubleCheckedSingleton();
        }
      }
    }
    return DoubleCheckedSingleton.instance;
  }
}

4. 静态内部类(推荐)

利用类加载机制保证线程安全,且实现懒加载。

export class InnerClassSingleton {
  private constructor() {}

  private static class Holder {
    static instance: InnerClassSingleton = new InnerClassSingleton();
  }

  public static getInstance(): InnerClassSingleton {
    return Holder.instance;
  }
}

关键注意事项:

  1. 私有构造函数:防止外部直接实例化
  2. 静态实例引用:通过类方法访问唯一实例
  3. 线程安全:根据场景选择同步方案
  4. 序列化:如涉及序列化需重写 readResolve() 方法

在鸿蒙Next中推荐使用饿汉式静态内部类实现,既保证线程安全又代码简洁。实际开发中可根据资源敏感程度选择合适方案。

回到顶部