如何在不可变类型构成的消息处理流水线中传递信息?
让你的消息类成为完全不可变类型的实现方案
嘿,我来帮你把这个ReceivedMessage类改造为完全不可变的类型,这样你在做逻辑推导的时候就不用担心意外修改状态啦!
核心改动与关键点
- 所有成员变量设为
const:一旦在构造函数初始化后,就再也无法修改它们的值,从根本上保证不可变性。 - 构造函数初始化所有
const成员:const成员变量不能在构造函数体内赋值,必须通过初始化列表完成——这里我把m_receivedAt直接用std::chrono::steady_clock::now()在构造时自动设置,确保消息的接收时间固定且无法篡改。 - 所有成员函数标记为
const:明确告诉调用者,这些函数不会改变对象的状态,同时也从语法上限制了函数内部修改成员变量的可能。
完整代码实现
#include <string> #include <chrono> class ReceivedMessage { public: // 构造函数:一次性初始化所有不可变成员 ReceivedMessage(const std::string& message) : m_message(message), m_receivedAt(std::chrono::steady_clock::now()) {} // 获取原始消息内容:返回const引用,避免拷贝同时防止外部修改 const std::string& GetReceivedMessage() const { return m_message; } // 获取消息接收时间:返回时间点值类型,本身不可修改 std::chrono::steady_clock::time_point GetReceivedAt() const { return m_receivedAt; } private: // 不可变的消息内容 const std::string m_message; // 不可变的接收时间点 const std::chrono::steady_clock::time_point m_receivedAt; };
额外的不可变性保障小技巧
- 不可变对象的拷贝是安全的:因为拷贝后的对象状态和原对象一致,且都无法修改,所以不需要刻意禁用拷贝构造/赋值。
- 如果类中有自定义类型的成员,要确保这些成员本身也是不可变类型,这样整个类的不可变性才是完整的。
这样改造后,ReceivedMessage对象一旦创建,它的消息内容和接收时间就永远固定了,完全符合你要的不可变类型需求,逻辑推导的时候就不用再担心状态变化的问题啦!
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

