Java 和 C++ 中的构建器?

2024-02-29

在谷歌的协议缓冲区 http://code.google.com/p/protobuf/API for Java,他们使用这些漂亮的构建器来创建对象(请参阅here http://code.google.com/apis/protocolbuffers/docs/javatutorial.html#builders):

Person john =
  Person.newBuilder()
    .setId(1234)
    .setName("John Doe")
    .setEmail("[email protected] /cdn-cgi/l/email-protection")
    .addPhone(
      Person.PhoneNumber.newBuilder()
        .setNumber("555-4321")
        .setType(Person.PhoneType.HOME))
    .build();

但相应的C++ API并不使用这样的Builders(参见here http://code.google.com/apis/protocolbuffers/docs/cpptutorial.html)

C++ 和 Java API 应该做同样的事情,所以我想知道为什么他们不在 C++ 中使用构建器。这背后是否有语言原因,即它不符合习惯用法或者在 C++ 中不受欢迎?或者可能只是编写 Protocol Buffers 的 C++ 版本的人的个人喜好?


在 C++ 中实现类似功能的正确方法是使用返回 *this 引用的 setter。

class Person {
  std::string name;
public:
  Person &setName(string const &s) { name = s; return *this; }
  Person &addPhone(PhoneNumber const &n);
};

该类可以像这样使用,假设有类似定义的 PhoneNumber:

Person p = Person()
  .setName("foo")
  .addPhone(PhoneNumber()
    .setNumber("123-4567"));

如果需要一个单独的构建器类,那么也可以这样做。应分配此类建设者 当然,在堆栈中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 和 C++ 中的构建器? 的相关文章

随机推荐

  • 删除 sourceSets.main.runtimeClasspath 中的 jar

    我的 gradle 中有这个 sourceSets main compileClasspath configurations provided runtimeClasspath configurations provided test co
  • 从选择框中删除重复条目

    我如何使用 jQuery 删除重复项
  • 如何制作在 iOS 上的 VLC 中播放的音乐文件的 URL?

    我想通过我的网站向 iPhone 和 iPad 用户提供 MP3 和其他文件格式 VLC 的 iOS 应用程序似乎符合要求 但他们说 Additionally third party websites and apps may includ
  • 从 VBA 项目中删除密码

    如何以编程方式从 Excel VBA 项目中删除 已知 密码 需要明确的是 我想从 VBA 项目中删除密码 而不是从工作簿或任何工作表中删除密码 删除 VBA 项目密码的另一种方法是 使用十六进制编辑器打开 xls 文件 即十六进制编辑ht
  • 如何调试 Captive Portal 中的浏览器?

    强制门户有一个浏览器 当您尝试连接到无线网络时 该浏览器有时会打开 有谁知道我该如何调试它 我已经尝试过的 我尝试运行模拟器 但模拟器无法打开门户 我尝试过将 iPhone 连接到我的 Mac 并使用 Safari 开发进行调试 但这仅在
  • 如何在雪豹上安装gem pg

    我需要在雪豹上安装 gem pg 因为我正在 Rails 代码库上运行 rake 我没有使用 postgres 这是我收到的错误 sudo gem install pg Password Sorry try again Password B
  • 自动映射器有什么用?

    What s 自动映射器 http www codeplex com AutoMapper for 它将如何帮助我处理域和控制器层 asp net mvc 也许一个例子会有所帮助 假设您有一个很好标准化的数据库模式 如下所示 Orders
  • Python——词法分析和标记化

    我希望加快我的发现过程 因为这是我第一次涉足词法分析领域 也许这甚至是一条错误的道路 首先 我将描述我的问题 我有非常大的属性文件 大约 1 000 个属性 经过提炼后 实际上只有大约 15 个重要属性 其余属性可以生成或很少更改 因此 例
  • 在加载时应用选择背景颜色?

    请查看以下链接以查看我的代码的运行情况 http codepen io DigitalSquid pen mAkuC http codepen io DigitalSquid pen mAkuC 如何使背景颜色出现在页面加载时 on win
  • MVC 模式中的“Hello World”

    在面试某家公司的时候 我被问到了这个问题 你知道哪些设计模式 然后我被告知基于 MVC 设计模式编写最简单的 hello world 应用程序 我想出了一个 JavaScript 程序 var arr a b c d this is an
  • 应用 pyspark ALS 的“recommendProductsForUsers”时出现 StackOverflow 错误(尽管可用 >300GB RAM 的集群)

    寻找专业知识来指导我解决以下问题 背景 我正在尝试使用受启发的基本 PySpark 脚本这 例子 https github com GoogleCloudPlatform spark recommendation engine blob m
  • Laravel 至少需要一个字段

    我有两个字段billable option and billable option yes 我想验证至少一个字段是必填字段 我努力了 this gt validate request billable option gt required
  • 获取linux可执行文件加载地址(__builtin_return_address和addr2line)

    我正在编写一些代码来存储每个内存分配的回溯 然后 我将这些列表写入文件以进行离线分析 在win32中我使用 AddressOfReturnAddress然后手动创建回溯 由于我使用的每次运行的地址都是随机的GetModuleInformat
  • 无法在 Crashlytics 中获取本机崩溃的堆栈跟踪

    我有一个 Android 项目 其中包含本机库 so 我已将 firebase crashlytics 集成到我的项目中 我能够在 firebase crashlytics 中获取 Java 崩溃的崩溃转储 但是 如果发生本机崩溃 堆栈跟踪
  • 如何定义具有键类型和值类型之间相关性的 Map,而它们都是并集

    这是显示我想要实现的目标的示例 除了两个问题之外 它几乎可以工作 设置不显示错误代码的错误 Immer Draft 类型 或任何 DeepWritable 实用程序类型 完全搞乱了这个技巧 基本上在我看来 我在这里所做的事情并不是什么真正的
  • 在 scrapyd 中启用 HttpProxyMiddleware

    阅读scrapy文档后 我认为HttpProxyMiddleware是默认启用的 但是当我通过 scrapyd 的 webservice 接口启动蜘蛛时 HttpProxyMiddleware 未启用 我收到以下输出 2013 02 18
  • 如何获取适用于 adMob 的测试广告横幅并测试插页式广告?

    我正在尝试设置 adMob 广告 我有两个问题 1 我是否正确使用了 adListener 接口 2 为什么我看不到插页式广告 让我们从 adListener 开始 据我从说明中了解到 adListener 是一个接口 所以我创建了一个界面
  • (iPhone) 我可以使用调度程序进行 AudioServicesPlaySystemSound 循环吗?

    我可以使用调度程序进行 AudioServicesPlaySystemSound 循环吗 一个问题是我无法获得声音持续时间 有什么方法可以获取持续时间 以便我可以动态创建循环声音的调度程序 据我所知 AudioService 没有内置循环和
  • 消息总线和消息队列理解

    我想知道我对消息总线和消息队列工作原理的理解是否正确 首先 我需要明确命名 服务巴士可以与以下互换使用消息总线 这是一种发布者 订阅者类型的系统 其中消息被添加到任意数量的发布者的消息集合中 并且任意数量的订阅者可以从中读取消息 到目前为止
  • Java 和 C++ 中的构建器?

    在谷歌的协议缓冲区 http code google com p protobuf API for Java 他们使用这些漂亮的构建器来创建对象 请参阅here http code google com apis protocolbuffe