3

协议缓冲区编译器生成的消息类是不可变的。消息类包含适当的 setter 方法,但没有 getter 方法。此约束不适用于其他序列化技术,如 Java 二进制序列化、XML、JSON 等。

据我了解,在进行并发编程时,不变性很有用。不变性可能有助于实现线程安全。但是,我认为这不是协议缓冲区的原因。

使消息类不可变的原因可能是什么?

阅读协议缓冲区文档后,似乎上述内容仅适用于 Java(至少)而不适用于 C++ 和其他受支持的平台/语言。

注意:这个问题只是为了满足我的好奇心。

谢谢。

4

1 回答 1

1

google 实现确实使用了构建器模式——即可变(但就实体而言不是非常有用)构建器,它创建了一个不可变对象实例。这不是必需的——事实上,有几个平台的替代实现使用这种设计模式。但坦率地说,这根本不是问题,因为如果有任何摩擦(以及您所描述的:摩擦),那么您应该简单地避免使用您的 DTO 类型(即用于序列化的对象)作为您的主要域实体类型。一旦你这样做,它就变成了一个非问题:你用你喜欢的任何模式编写你自己的域实体类型(包括任何域逻辑等),然后在需要时映射到/从 DTO 类型;那么 DTO 层使用的设计模式的选择只是一个无趣的实现细节。

但同样:对于您选择的平台,看看是否有任何替代实现可能更符合您的要求。

于 2013-08-06T09:20:16.283 回答