在鸿蒙应用开发的 class 类中,访问修饰符(public/private/protected)和静态修饰符(static)是控制类成员行为的核心工具,而单例模式(确保类只有一个实例)的实现高度依赖这些修饰符。以下是详细总结及单例中的使用案例:

一、核心修饰符的含义

1. 访问修饰符(控制访问范围)
修饰符 含义 可访问范围
public 公共成员(默认),无访问限制 类内部、外部、子类均能访问
private 私有成员,仅当前类内部可访问 仅类自身,外部和子类均不可访问
protected 受保护成员,允许当前类和子类访问 类内部和子类,外部不可访问
2. 静态修饰符(static
  • 修饰的成员(属性 / 方法)属于类本身,而非实例,所有实例共享同一静态成员。
  • 无需创建实例,直接通过 类名.成员 调用,常用于工具方法、全局状态或单例实例存储。
3. 只读修饰符(readonly
  • 成员初始化后不可修改,可修饰实例属性或静态属性,确保数据安全性。

二、单例模式中修饰符的使用案例

单例模式的核心是确保类在应用生命周期中只有一个实例,并提供全局访问点。在鸿蒙开发中,常用 static 存储唯一实例,用 private 限制构造函数防止外部创建新实例。

典型单例实现(结合修饰符)

typescript

// 日志管理工具类(单例模式)
class Logger {
  // 1. 静态私有属性:存储唯一实例(static保证属于类,private防止外部修改)
  private static instance: Logger | null = null;

  // 2. 私有构造函数(private防止外部通过new创建实例)
  private constructor() {
    // 初始化逻辑(如配置日志级别)
  }

  // 3. 静态公共方法:提供全局访问点(static允许类名直接调用,public允许外部访问)
  public static getInstance(): Logger {
    if (!Logger.instance) {
      // 仅第一次调用时创建实例
      Logger.instance = new Logger();
    }
    return Logger.instance;
  }

  // 4. 公共实例方法:日志打印功能(public允许外部调用)
  public log(message: string): void {
    console.log(`[LOG] ${message}`);
  }

  // 5. 私有辅助方法:内部处理逻辑(private隐藏实现细节)
  private formatMessage(message: string): string {
    return `[${new Date().toLocaleString()}] ${message}`;
  }
}
使用方式

typescript

// 无法通过new创建实例(构造函数是private)
// const logger = new Logger(); // 报错

// 只能通过静态方法获取唯一实例
const logger1 = Logger.getInstance();
const logger2 = Logger.getInstance();

console.log(logger1 === logger2); // 输出:true(证明是同一实例)
logger1.log("应用启动"); // 输出:[LOG] [2023-10-16 10:00:00] 应用启动

三、单例中修饰符的关键作用

  1. private constructor()禁止外部通过 new 关键字创建实例,确保实例只能由类内部生成,是单例的核心约束。

  2. private static instance

    • static 保证实例存储在类级别,而非实例级别,全局唯一。
    • private 防止外部直接修改或赋值 instance,避免单例被破坏。
  3. public static getInstance()

    • static 允许通过 类名.getInstance() 直接调用,无需先创建实例。
    • public 暴露全局访问点,让外部能获取单例实例。
  4. 其他成员修饰符

    • 工具方法(如日志打印)用 public 暴露给外部使用。
    • 内部辅助逻辑(如消息格式化)用 private 隐藏,避免外部依赖。

四、常见单例场景(鸿蒙开发)

  1. 全局状态管理:如用户信息管理器(UserManager),确保全应用使用同一用户实例。
  2. 工具类:如网络请求工具(HttpUtil)、存储工具(StorageUtil),避免重复初始化资源。
  3. 服务类:如音乐播放控制器(AudioPlayer),确保音频播放状态全局一致。

总结

  • 访问修饰符通过控制成员可见性,实现单例的 “封装性”(private 构造函数和实例)和 “可访问性”(public 访问方法)。
  • 静态修饰符(static)实现单例的 “唯一性”(类级实例存储)和 “全局访问”(静态获取方法)。
  • 在鸿蒙开发中,合理结合这些修饰符实现的单例,能有效节省资源、保证状态一致性,是大型应用的常用设计模式。
Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐