You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Protobuf消息A与B转换时条件性设置字段的写法是否正确?

Protobuf消息转换代码问题解答

当前写法的问题

  1. 语法错误:代码中.setId(B.getId())是错误的,B是类名,b是传入的实例对象,应该调用实例的getId()方法,即改为.setId(b.getId()),否则编译会报错。

  2. 逻辑不符合需求:

    • 你的需求是仅当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是危险的,会导致运行时异常。

正确的写法

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 09:20:21