协议缓冲区编译器生成的消息类是不可变的。消息类包含适当的setter方法,但没有getter方法。此约束不适用于其他序列化技术,如Java二进制序列化,XML,JSON等。
根据我的理解,在进行并发编程时,不变性是有用的。不可变性可能有助于实现线程安全。但是,我认为,这不是协议缓冲区的原因。
使消息类不可变的原因是什么?
阅读协议缓冲区文档后,上述内容似乎仅适用于Java(至少),而不适用于C ++和其他受支持的平台/语言。
注意:这个问题只是为了满足我的好奇心。
感谢。
答案 0 :(得分:0)
google实现确实使用了构建器模式 - 即可变(但在实体方面不太可用)构建器,它构建了一个不可变对象实例。这不是要求 - 实际上,对于不使用此设计模式的多个平台,存在替代实现。但坦率地说,它根本不是问题,因为如果存在任何摩擦(以及你描述的内容:摩擦),那么你应该简单地避免使用你的DTO类型(即用于序列化的对象)您的主域实体类型。一旦你这样做,它就变成一个非问题:用你喜欢的任何模式编写你自己的域实体类型 (包括任何域逻辑等),然后映射到DTO类型/从DTO类型映射当你需要的时候;那么DTO层使用的设计模式的选择仅仅是一个无趣的实现细节。
但是,再次:对于您选择的平台,请仔细查看any alternative implementations是否更符合您的要求。