java链式调⽤_Java链式调⽤-Builder模式
过去写链式调⽤感觉⼜臭⼜长,这种编码⽅式的代码看着很不爽,且不明⽩调⽤的顺序。⽽且⽼师教的时候就已经习惯了,“⼀⾏⼀句,分号结尾”。现在呢,感觉⼜要极⼒推崇链式调⽤了,因为它还真⽅便!当你慢慢熟悉之后就会发现这样写⽆论在可读性和代码量上都有优势。
在讲链式调⽤之前,还是先说⼀下,java的⼀个设计模式吧 – Builder模式
Builder模式
Builder模式是⼀种⼀步⼀步创建⼀个复杂对象的设计模式,这种设计模式的精髓就主要有两点:其⼀,⽤户使⽤简单,并且可以在不需要知道内部构建细节的情况下,就可以构建出复杂的对象模型;其⼆,对于设计者来说,这是⼀个解耦的过程,这种设计模式可以将构建的过程和具体的表⽰分离开来。
Builder模式的使⽤场景
相同的⽅法,不同的执⾏顺序,产⽣不同的时间结果
多个部件或零件,都可以装配到⼀个对象中,但是产⽣的运⾏结果⼜不同时
产品类⾮常复杂,或者产品类中的调⽤顺序不同产⽣了不同的作⽤,这个时候⽤建造者模式⾮常适合
当初始化⼀个对象特别复杂,如参数多,且很多参数都具有默认值
链式调⽤
链式调⽤的变形太多了,先看⽐较经典的
package builder;
/**
* Builder模式,链式调⽤Demo
*
* @author junehappylove
*
*/
public class User {
private final String firstName;
private final String lastName;
private final int age;
private final String phone;
private final String address;
private User(UserBuilder builder) {
this.firstName = builder.firstName;
this.lastName = builder.lastName;
this.age = builder.age;
this.phone = builder.phone;
this.address = builder.address;
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public int getAge() {
return age;
}
public String getPhone() {
return phone;
}
public String getAddress() {
return address;
}
//Builder
public static class UserBuilder {
private final String firstName;
private final String lastName;
private int age;
private String phone;
private String address;
public UserBuilder(String firstName, String lastName) { this.firstName = firstName;
this.lastName = lastName;
}
public UserBuilder age(int age) {
this.age = age;
return this;
}
public UserBuilder phone(String phone) {
this.phone = phone;
return this;
public UserBuilder address(String address) {
this.address = address;
return this;
}
public User build() {
// 由于Builder是⾮线程安全的,所以如果要在Builder内部类中检查⼀个参数的合法性,
// 必需要在对象创建完成之后再检查
User user = new User(this);
if (Age() < 0 || Age() > 255) {
throw new IllegalStateException("Age out of range:" + Age());// 线程安全
}
return user;
}
}
public static void main(String[] args) {
User june = new User.UserBuilder("Wang", "wei").age(18).address("qdao").build();
System.out.Address());
}
}
有⼏个重要的地⽅需要强调⼀下:
User类的构造⽅法是私有的。也就是说调⽤者不能直接创建User对象。
User类的属性都是不可变的。所有的属性都添加了final修饰符,并且在构造⽅法中设置了值。并且,对外只提供getters⽅法。Builder模式使⽤了链式调⽤。可读性更佳。
Builder的内部类构造⽅法中只接收必传的参数,并且该必传的参数使⽤了final修饰符。
再看⼀下⼀些变种的链式调⽤:
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
public String getPassword() {
return password;
}
public void setPassword(String password) { this.password = password;
}
public static Builder builder() {
return new Builder();
}
private User(Builder builder) {
this.username = builder.username;
shiro安全框架this.password = builder.password;
}
public static class Builder {
private String username;
private String password;
public Builder setUserName(String username) { this.username = username;
return this;
}
public Builder setPassword(String password){ this.password=password;
return this;
}
public User build() {
return new User(this);
}
@Override
public String toString() {
return "Builder{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
public static void main(String[] args) {
Builder builder = new User.Builder();
builder.setUserName("lss0555")
.setPassword("12345")
.build();
//或者
User user = new User.Builder().setUserName("lss0555").setPassword("123123").build();
//或者
User user1 = User.builder().setUserName("lss0555").setPassword("654321").build();
System.out.println("builder结果:"+String());
System.out.println("User结果:"+String());
System.out.println("User2结果:"+String());
}
}
上⾯这个⼤架⼦基本不变,但是
User的属性,没有⽤final修饰
提供了setters⽅法
提供了⼀个静态的builder⽅法,⽤于在User中获取Builder对象
应⽤
有位⽼哥,有这样经典的描述
本⼈在学习Java,直接先学习Netty框架,因为Netty框架是业界最流⾏的NIO框架之⼀,在学习的过程中,了解到Netty服务端启动需要先创建服务器启动辅助类ServerBootstrap,它提供了⼀系列的⽅法⽤于设置服务器端启动相关的参数。然⽽在创建ServerBootstrap实例时,发现ServerBootstrap只有⼀个⽆参的构造函数,事实上它需要与多个其它组件或者类交互。ServerBootstrap构造函数没有参数的原因是因为它的参数太多了,⽽且未来也可能会发⽣变化。Netty创造者为了解决这个问题,就引⼊了Builder模式。
有⽊有发现,讲Builder模式的链式调⽤,各路的⼤神都在使⽤⽤户User说事?为啥都不讲个其他的业务场景,哈哈,有部分原因是你抄我,我抄你;更重要的是User确实⽤的多哦,且翻⼀翻各路的开源框架中,你就会发现,链式调⽤⼀般会⽤在如下的场景中:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。