@AllArgsConstructor
@NoArgsConstructor
public class User {
private String id;
private String name;
private int age;
public static void main(String[] args) {
User tom = new User("1", "Tom", 20);
}
}
@NoArgsConstructor
@Data
public class User {
private String id;
private String name;
private int age;
public static void main(String[] args) {
User tom = new User();
tom.setId("1");
tom.setName("tom");
tom.setAge(20);
}
}
@Builder
public class User {
private String id;
private String name;
private int age;
public static void main(String[] args) {
User tom = User.builder().id("1").name("Tom").age(20).build();
}
}
如果仅仅是为了代码优雅那使用javaBean的set返回this也可以实现和Builder相仿的效果
public class User {
private String id;
private String name;
private int age;
public User setId(String id) {
this.id = id;
return this;
}
public User setName(String name) {
this.name = name;
return this;
}
public User setAge(int age) {
this.age = age;
return this;
}
public static void main(String[] args) {
// 对象虽然只有一行调用, 但实际是被分到几个调用中, 需要额外付出额外的努力确保线程安全
User tom = new User().setId("1").setName("Tom").setAge(20);
// 同时也无法保证何时是最终态
tom.setName("Jerry");
}
}
下面总结摘自 java中Builder构建器的理解
所以说Builder构建器的真正意义并不是代码优美
Effective Java中写到:遗憾的是,javaBeans模式自身有着很严重的缺点。因为构造过程被分到了几个调用中,在构建过程中JavaBeans可能处于不一致的状态。类无法仅仅通过检验构造器参数的有效性来保证一致性。试图使用处于不一致状态的对象,将会导致失败,这种失败与包含错误的代码大相径庭,因此它调试起来十分困难。与此相关的另一点不足在于,JavaBeans模式阻止了把类做成不可变得可能,这就需要程序员付出额外的努力来确保它的线程安全。
理解了这段意思之后就可以明白,三种创建对象的方式的区别: