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

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

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

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

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

HarmonyOS
6天前
浏览
收藏 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
微信
回复
6天前
相关问题
HarmonyOS 连续两次@Link之后UI没更新
143浏览 • 1回复 待解决
ArkTS层实例化介绍
3383浏览 • 1回复 待解决
HarmonyOS 问题
350浏览 • 1回复 待解决
HarmonyOS 轨迹线样式和预期不符
332浏览 • 1回复 待解决
HarmonyOS Text添加动画效果与预期不符
269浏览 • 1回复 待解决
HarmonyOS BlendMode显示效果不符预期
181浏览 • 1回复 待解决
HarmonyOS 关于问题
408浏览 • 1回复 待解决
HarmonyOS 对象如何实现
708浏览 • 1回复 待解决
HarmonyOS 模式不生效
106浏览 • 1回复 待解决
点击事件冒泡不符预期
897浏览 • 1回复 待解决