Java中的构建者与C++?

2022-09-04 02:55:09

在Google的Copert Buffer API for Java中,他们使用这些漂亮的Builder来创建一个对象(请参阅此处):

Person john =
  Person.newBuilder()
    .setId(1234)
    .setName("John Doe")
    .setEmail("jdoe@example.com")
    .addPhone(
      Person.PhoneNumber.newBuilder()
        .setNumber("555-4321")
        .setType(Person.PhoneType.HOME))
    .build();

但相应的C++ API 不使用此类构建器(请参阅此处)

C++和Java API应该做同样的事情,所以我想知道为什么他们没有在C++中使用构建器。这背后是否有语言原因,即它不是惯用语,或者C++中令人不快?或者可能只是编写C++版本的协议缓冲区的人的个人偏好?


答案 1

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

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

该类可以这样使用,假设类似定义的电话号码:

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

如果需要一个单独的生成器类,那么也可以这样做。当然,这样的构建器应该按堆栈分配。


答案 2

我会选择“非惯用语”,尽管我已经C++代码中看到了这种流畅界面风格的例子。

这可能是因为有许多方法可以解决相同的潜在问题。通常,这里要解决的问题是命名参数(或者更确切地说是缺少它们)。一个可以说更C++解决这个问题的解决方案可能是Boost的参数库


推荐