2013-08-06 56 views
2

協議緩衝區編譯器生成的消息類是不可變的。消息類包含適當的setter方法,但沒有getter方法。此約束不適用於其他序列化技術,如Java二進制序列化,XML,JSON等。爲什麼協議緩衝區編譯器生成的消息類都是不可變的?

根據我的理解,不可變性在進行併發編程時有用。不變性可能有助於實現線程安全。但是,我認爲,這不是協議緩衝區的原因。

什麼可能是使消息類不可變的原因?

閱讀協議緩衝區文檔後,似乎上述規定僅適用於Java(至少),而不適用於C++和其他支持的平臺/語言。

注:這個問題只是爲了滿足我的好奇心。

謝謝。

回答

0

谷歌的實現確實使用了一個構建器模式 - 即一個可變的(但在實體方面不是很實用)構建器,它創建了一個不可變的對象實例。這不是的要求 - 實際上,有幾個平臺的替代實現可以使用而不是使用此設計模式。但坦率地說,這根本不是問題,因爲如果存在摩擦(以及你所描述的:摩擦),那麼你應該避免使用DTO類型(即用於序列化的對象)作爲主要的域實體類型。只要你這樣做,它就成爲一個非問題:你寫你自己的域名實體類型與你喜歡的任何模式(包括任何域邏輯等),然後映射到/從DTO類型當你需要至;那麼DTO層使用的設計模式的選擇僅僅是一個無趣的實現細節。

但是,對於您選擇的平臺,請仔細查看any alternative implementations是否可能更符合您的要求。

+0

我剛開始學習protobuf。由於我的好奇心,我問了這個問題。由於消息類的不變性,我沒有面臨任何阻塞。我應該在問題中提到它。 –

+0

這不回答基本問題。他們爲什麼選擇讓它們在java中不可變而不在C++中? – Thomas

+0

@Thomas因爲這是一個非常常見的Java語言 –

相關問題