第 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 来验证本课契约。
与上一课的联系
上一课为成功和失败建立独立夹具,本课增加一个独立的顺序重复关闭契约测试。