Protobuf消息A与B转换时条件性设置字段的写法是否正确?
Protobuf消息转换代码问题解答
当前写法的问题
语法错误:代码中
.setId(B.getId())是错误的,B是类名,b是传入的实例对象,应该调用实例的getId()方法,即改为.setId(b.getId()),否则编译会报错。逻辑不符合需求:
- 你的需求是仅当B的C字段存在且C的name字段存在时,才设置A的name字段。但当前代码只判断了
b.hasC(),没有判断b.getC().hasName()。如果C字段存在但name未设置,b.getC().getName()会返回空字符串(Java Protobuf中string类型的optional字段默认值为空串),此时调用setName会把A的name字段设置为空串,而不是保持未设置状态。 - 另外,Java Protobuf的
setName(null)会抛出NullPointerException,当前代码中else分支传null是危险的,会导致运行时异常。
- 你的需求是仅当B的C字段存在且C的name字段存在时,才设置A的name字段。但当前代码只判断了
正确的写法
private A convertFromBToA(B b) { A.Builder builder = A.newBuilder() .setId(b.getId()); // 仅当C存在且C的name字段存在时,才设置A的name if (b.hasC() && b.getC().hasName()) { builder.setName(b.getC().getName()); } return builder.build(); }
说明
这种写法下,只有当B的C字段存在且C的name字段已被显式设置时,才会给A的name字段赋值;否则A的name字段会保持默认的未设置状态,完全符合你的需求。
内容的提问来源于stack exchange,提问作者tigoa
相关产品推荐
相关产品推荐

