论Protobuf在Java中的Immutability
Posted 合格的程序猿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了论Protobuf在Java中的Immutability相关的知识,希望对你有一定的参考价值。
在Java中使用过Protobuf的同学应该都知道,其编译出来的Proto类是不可变的,因此,其也会伴随着编译出来一个Builder类,想要对类进行构造或者修改则需要使用Builder类来完成。
那么,为何Google要把其设计成不可变的类呢?我们通过与C++进行比较来探讨出来结果。
1、在C++中有个关键词 const,如果对象被传入到一个function中并且被设置为了const,那么这个对象在function中则是不可改变的。如下例:
class Boo {
public:
void set_val(int nval) { val = nval; }
int get_val() const { return val; }
private:
int val;
};
void function(const Boo& b1, Boo& b2) {
// 下面的声明在编译阶段会产生错误
b1.set_val(0);
b1.get_val();
b2.set_val(0);
b2.set_val();}
2、然而,在Java中在进行对象操作的时候,都是引用(指针)级别的,而且也没有类似于C++中的const来控制该对象是否可变,因此就无法实现1中的效果。(多说一句,笔者曾经写过的代码中对于接口的实现,把请求的对象RequestVo在逻辑实现过程中进行了修改,这个是后续大家都应该注意的,正常情况下不要改变你的输入,只够造输出!)
此时,Protobuf在Java中的Immutability则可以大展身手。如果你想要接口中的input不可变,则可以使用protobuf的不可变对象作为入参;如果想要改变input,则可以使用Builder作为入参。
因此,protobuf的这种设计方式,解决了Java语法中无法实现的功能:对象不可变性。
关于这个特性,你是否还有其他的见解?欢迎讨论~
相关阅读:
以上是关于论Protobuf在Java中的Immutability的主要内容,如果未能解决你的问题,请参考以下文章