Java这种语法格式是否正常?Protocol Buffers教程代码疑问
这种Java链式调用语法完全正常,而且非常实用!
别担心,你看到的这种写法是Java里很常见的链式调用(Method Chaining),尤其是在像Protocol Buffers这类使用Builder模式的场景里,几乎是标准写法。我来帮你拆解清楚:
核心原理:每个方法都返回对象本身
你疑惑的.setId()、.setName()这些方法,它们的返回值并不是void——而是返回当前正在操作的Person.Builder对象本身。这样你就可以在调用完一个方法后,直接接着调用下一个方法,不用每次都把builder赋值给变量再操作。
一步步拆解你的代码
Person.newBuilder():这一步会创建并返回一个可变的Person.Builder实例,Protocol Buffers用这个Builder来构建最终不可变的Person对象。.setId(1234):调用Builder的setId方法,设置id字段,然后返回这个Builder自己。.setName("John Doe"):接着用同一个Builder对象调用setName,设置名字后依然返回自己。- 嵌套的
.addPhones(...):这里同样是调用Builder的addPhones方法,传入一个构建好的PhoneNumber实例,返回的还是原来的Person.Builder。 .build():最后调用build()方法,这个方法会把Builder里的所有字段组装成一个不可变的Person实例,赋值给john变量。
给你模拟个简化版Builder实现,更容易理解
如果自己写个类似的Builder类,逻辑大概是这样:
public class Person { // 不可变的Person实例字段 private final int id; private final String name; private final String email; // 私有构造方法,只能通过Builder创建 private Person(Builder builder) { this.id = builder.id; this.name = builder.name; this.email = builder.email; } // 创建Builder的入口方法 public static Builder newBuilder() { return new Builder(); } // 内部Builder类,负责构建Person public static class Builder { private int id; private String name; private String email; // 每个set方法都返回this,实现链式调用 public Builder setId(int id) { this.id = id; return this; } public Builder setName(String name) { this.name = name; return this; } public Builder setEmail(String email) { this.email = email; return this; } // 最终构建不可变的Person实例 public Person build() { return new Person(this); } } }
看,每个setXxx方法都返回this(当前Builder对象),这就是链式调用的核心。
这种写法的好处是代码更紧凑、可读性更强,尤其是在构建有大量字段的对象时,比写一堆单独的赋值语句清爽多了——Protocol Buffers正是看中了这一点,所以自动生成的Builder类都采用了这种设计。
内容的提问来源于stack exchange,提问作者user8897013
相关产品推荐
相关产品推荐

