渐进式编程课
鸿蒙 目录
第 46 课2026.09.04

验证已成功关闭的资源再次关闭时不会重复释放。

第 46 课:顺序重复关闭的幂等契约

  • 日期:2026-09-04
  • 课程序号:第 46 课
  • 知识点:资源释放次数与重复调用

用途

验证已成功关闭的资源再次关闭时不会重复释放。

核心概念

本课明确约定顺序 close 幂等:第一次成功后再次调用无副作用。closed 是资源自身生命周期,不是 UI 状态锁;并发关闭与失败重试不在本课契约内。

最小代码或操作示例

ts
import { describe, expect, it } from "@ohos/hypium";
class FakeHandle {
  releaseCount: number = 0;
  async release(): Promise<void> {
    this.releaseCount += 1;
    await Promise.resolve();
  }
}
class Channel {
  private closed: boolean = false;
  private handle: FakeHandle;
  constructor(handle: FakeHandle) { this.handle = handle; }
  async close(): Promise<void> {
    if (this.closed) { return; }
    await this.handle.release();
    this.closed = true;
  }
}
export default function sequentialCloseTest(): void {
  describe("sequential close", () => {
    it("repeatedCloseReleasesOnce", 0, async () => {
      const handle: FakeHandle = new FakeHandle();
      const channel: Channel = new Channel(handle);
      await channel.close();
      await channel.close();
      expect(handle.releaseCount).assertEqual(1);
    });
  });
}

3~5 分钟练习

注册到已有 Hypium 入口;第三次 await channel.close() 后再次检查 releaseCount,再创建另一个独立 Channel。

参考答案

同一个 Channel 连续关闭三次,releaseCount 仍为 1;另一个 Channel 应使用新的 FakeHandle,其首次关闭计数也是 1。不要用 Promise.all 替代顺序 await 来验证本课契约。

与上一课的联系

上一课为成功和失败建立独立夹具,本课增加一个独立的顺序重复关闭契约测试。