我正在用D编程语言编写一个多线程程序,但我对这门语言很新。使用Tid.send()
包中receive[Only]()
和std.concurrency
API的线程之间传递的类型存在限制,它们必须是值类型,或者必须保持不变以避免发送方和接收方之间的竞争条件线程。我有一个简单的struct Message
类型,我一直在传递值:
enum MessageType {
PrepareRequest,
PrepareResponse,
AcceptRequest,
Accepted
}
struct Message {
MessageType type;
SysTime timestamp;
uint node;
ulong value;
}
然而,有些MessageType
没有所有字段,并且使用switch语句并且在我可以使用多态来自动执行此操作时记住哪些类型具有哪些字段是令人讨厌的。是使用这里推荐的immutable
类层次结构,还是我已经采用最佳方法的方法,为什么?
修改
另外,如果我应该使用不可变类,那么创建用户定义类的不可变对象的推荐方法是什么?它们来自的类的静态方法将返回值强制转换为immutable
?
答案 0 :(得分:2)
作为一个经验法则,如果您有多态类型层次结构,则类是要使用的工具。如果突变在设计上是不可能的,那么不可变类应该有效地发挥作用。
最近发布了来自Ali的DConf2013的精彩演讲:http://youtu.be/mPr2UspS0fE。它详细介绍了D中const
和immutable
的使用主题。它建议使用的其他好东西
用于创建不可变类的auto var = new immutable(ClassType)(...);
语法。然后所有初始化都转到构造函数,不需要特殊的黑客攻击。