HarmonyOS 单例执行了两次构造方法,与预期不符

子模块中的FZServiceManager.ets:

export class FZServiceManager {
  private static _instance: FZServiceManager
  /* 单例 */
  static get sharedInstance(): FZServiceManager {
    if (!FZServiceManager._instance) {
      FZServiceManager._instance = new FZServiceManager()
    }
    return FZServiceManager._instance
  }

  constructor() {
    console.log("======initServiceInstance=====");
    this.initInfoMap()
    this.initServiceInstance()
  }

  private initInfoMap() {
    // ...

  }

  private async initServiceInstance() {
    // ...
  }
}
export const serviceManager = FZServiceManager.sharedInstance
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.

我分别在AblilityStage.ets,与Index.ets中 import { FZServiceManager } from 'module'

在应用程序启动时上述构造方法中的“====== initServiceInstance =====”输出了两次,表明执行了两次构造方法,这与单线程的预期不符合

通过断点发现是export const serviceManager = FZServiceManager.sharedInstance这段执行了两次,这似乎是FZServiceManager被引入了两次

请解答:为什么export const serviceManager = FZServiceManager.sharedInstance会执行两次? 我有什么方式可以安全的创建单例?

HarmonyOS
2025-01-09 15:21:17
477浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
aquaa

HAR中的代码和资源跟随使用方编译,如果有多个使用方,它们的编译产物中会存在多份相同拷贝。比如多个HAP引用同一个HAR,其实上是引用了多份HAR,会有多个互不影响的HAR中的单例。

HSP中的代码和资源可以独立编译,运行时在一个进程中代码也只会存在一份。比如多个HAP引用HSP,引用的就是同一个HSP。

所以要想创建一个全局的单例,建议写在HSP中,而不是HAR中。

参考文档:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/application-package-overview-V5

另外运行时找不到模块,建议初始化调用不要放在constructor中,放在需要调用的地方,调整代码结构已处理解决.

分享
微博
QQ
微信
回复
2025-01-09 18:14:45


相关问题
HarmonyOS 连续两次@Link之后UI没更新
588浏览 • 1回复 待解决
HarmonyOS 轨迹线样式和预期不符
608浏览 • 1回复 待解决
HarmonyOS BlendMode显示效果不符预期
749浏览 • 1回复 待解决
HarmonyOS Text添加动画效果与预期不符
723浏览 • 1回复 待解决
ArkTS层实例化介绍
4275浏览 • 1回复 待解决
点击事件冒泡不符预期
1319浏览 • 1回复 待解决
HarmonyOS 问题
1039浏览 • 1回复 待解决
HarmonyOS 关于问题
1119浏览 • 1回复 待解决
RichText组件font标签size属性不符预期
2571浏览 • 1回复 待解决
HarmonyOS 对象如何实现
1268浏览 • 1回复 待解决