链式编程可以使得代码可读性高,链式编程的原理就是返回一个this对象,就是返回本身,达到链式效果,举个例子,下面是一个学生bean
-
public
class StudentBean {
-
private String name;
-
private
int age;
-
-
public String getName() {
-
return name;
-
}
-
-
public StudentBean setName(String name) {
-
this.name = name;
-
return
this;
-
}
-
-
public int getAge() {
-
return age;
-
}
-
-
public StudentBean setAge(int age) {
-
this.age = age;
-
return
this;
-
}
-
}
这段代码和传统的Bean区别就是我在set属性时候会返回一个this这样就达到了链式编程的效果
-
public static void main(String[] args) {
-
StudentBean studentBean =
new StudentBean().setAge(
22).setName(
"ly");
-
-
System.out.println(studentBean.getAge());
-
-
System.out.println(studentBean.getName());
-
}
lombok其实已经提供该style,我们把这个bean改成lombok实现只需要加上一个@Accessors(chain = true)即可
-
@Accessors(chain =
true)
-
@Getter
-
@Setter
-
public
class StudentBean {
-
private String name;
-
-
private
int age;
-
}
这样代码简洁多了 ,而且实现了链式编程,那如何用lombok实现一个静态的链式编程呢,再回过头来看刚刚的StudentBean,很多时候,我们去写StudentBean这个bean的时候,他会有一些必输字段,比如StudentBean中的name字段,一般处理的方式是将name字段包装成一个构造方法,只有传入name这样的构造方法,才能创建一个StudentBean对象。
接上上边的静态构造方法和必传参数的构造方法,使用lombok将更改成如下写法(@RequiredArgsConstructor 和 @NonNull):
-
@Accessors(chain =
true)
-
@Getter
-
@Setter
-
@RequiredArgsConstructor(staticName =
"of")
-
public
class StudentBean {
-
@NonNull
private String name;
-
-
private
int age;
-
}
测试方法:
-
public static void main(String[] args) {
-
StudentBean studentBean = StudentBean.of(
"ly").setAge(
22);
-
-
System.out.println(studentBean.getAge());
-
-
System.out.println(studentBean.getName());
-
}
这样不仅实现了链式编程,还实现了静态创建,那么怎么实现一个builder模式的链式Bean呢,build模式实现原理为在bean里面创建一个静态builder方法和一个静态内部Builder类,通过调用静态builder方法来创建Builder类,然后通过builder类中的build方法直接创建一个Bean,具体如下:
-
public
class StudentBean {
-
private String name;
-
-
private
int age;
-
-
public String getName() {
-
return name;
-
}
-
-
public void setName(String name) {
-
this.name = name;
-
}
-
-
public int getAge() {
-
return age;
-
}
-
-
public void setAge(int age) {
-
this.age = age;
-
}
-
-
public static Builder builder() {
-
return
new Builder();
-
}
-
-
public
static
class Builder{
-
private String name;
-
-
private
int age;
-
-
public Builder name(String name) {
-
this.name = name;
-
return
this;
-
}
-
-
public Builder age(int age) {
-
this.age = age;
-
return
this;
-
}
-
-
public StudentBean build() {
-
StudentBean studentBean =
new StudentBean();
-
studentBean.setName(name);
-
studentBean.setAge(age);
-
return studentBean;
-
}
-
}
-
}
测试方法:
StudentBean studentBean = StudentBean.builder().name("ly").age(11).build();
这样就实现了一个builder模式的链式bean,其实用lombok就一个注解的事情,调用与上面同样
-
@Builder
-
public
class StudentBean {
-
private String name;
-
-
private
int age;
-
}
<li class="tool-item tool-active is-like "><a href="javascript:;"><svg class="icon" aria-hidden="true"> <use xlink:href="#csdnc-thumbsup"></use> </svg><span class="name">点赞</span> <span class="count">3</span> </a></li> <li class="tool-item tool-active is-collection "><a href="javascript:;" data-report-click="{"mod":"popu_824"}"><svg class="icon" aria-hidden="true"> <use xlink:href="#icon-csdnc-Collection-G"></use> </svg><span class="name">收藏</span></a></li> <li class="tool-item tool-active is-share"><a href="javascript:;"><svg class="icon" aria-hidden="true"> <use xlink:href="#icon-csdnc-fenxiang"></use> </svg>分享</a></li> <!--打赏开始--> <!--打赏结束--> <li class="tool-item tool-more"> <a> <svg t="1575545411852" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M179.176 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5718"></path><path d="M509.684 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5719"></path><path d="M846.175 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5720"></path></svg> </a> <ul class="more-box"> <li class="item"><a class="article-report">文章举报</a></li> </ul> </li> </ul> </div> </div> <div class="person-messagebox"> <div class="left-message"><a href="https://blog.csdn.net/u013822349"> <img src="https://profile.csdnimg.cn/4/0/1/3_u013822349" class="avatar_pic" username="u013822349"> <img src="https://g.csdnimg.cn/static/user-reg-year/2x/6.png" class="user-years"> </a></div> <div class="middle-message"> <div class="title"><span class="tit"><a href="https://blog.csdn.net/u013822349" data-report-click="{"mod":"popu_379"}" target="_blank">一念落叶</a></span> </div> <div class="text"><span>发布了16 篇原创文章</span> · <span>获赞 15</span> · <span>访问量 2万+</span></div> </div> <div class="right-message"> <a href="https://im.csdn.net/im/main.html?userName=u013822349" target="_blank" class="btn btn-sm btn-red-hollow bt-button personal-letter">私信 </a> <a class="btn btn-sm bt-button personal-watch" data-report-click="{"mod":"popu_379"}">关注</a> </div> </div> </div>