流式编程风格,让你的代码更简单

哈喽,大家好。

我们在使用StringBuilder的时候,经常会用到以下的写法

stringBuilder.append("1").append("2");

这种写法就是我们今天的主角:fluent(流式)编程,它是一种编程的风格,可以让我们的代码简单易懂,code量更小,更易于编写。这种写法的主要特点就是在做完一件事之后会返回对象本身,下面我们就来看看具体的写法。

首先我们先来看看我们平常的写法:

public class ConveBean {private String id;private String name;public String getId() { return id; }public void setId(String id) { this.id = id; }public String getName() { return name; }public void setName(String name) { this.name = name; }@Override public String toString() { return "ConveBean{" + "id='" + id + '\'' + ", name='" + name + '\'' + '}'; }}

我们通常都会使用这样的写法,然后new一个对象实例,使用set方法赋值,get方法取值,使用起来大致是这样:

ConveBean conveBean = newConveBean();conveBean.setId("1");conveBean.setName("name");System.out.println(conveBean.toString());

执行结果:ConveBean{id='1', name='name'}

接下来我们再来看看fluent编程是怎么样写的:

public class FluentBean {private FluentBean(){}private String id;private String name;public static FluentBean builder(){ return new FluentBean(); }public String getId() { return id; }public FluentBean setId(String id) { this.id = id; return this; }public String getName() { return name; }public FluentBean setName(String name) { this.name = name; return this; }@Override public String toString() { return "FluentBean{" + "id='" + id + '\'' + ", name='" + name + '\'' + '}'; }}

我们将对象的构造函数私有化,防止new实例对象,如果我们需要获取实例对象,则调用其静态方法buidel即可获取,然后再set方法最后添加一行返回对象本身的代码,这样当我们使用这个对象的时候大致就是这样子了:

System.out.println(FluentBean.builder().setId("1").setName("name").toString());

执行结果:FluentBean{id='1', name='name'}

对比一下是不是感觉变简单了很多,这就是我们使用流式编程的的好处了,当然了,我们的方法体并不一定只是简单的赋值操作,你完全可以用它来做一些复杂的事,只要方法体最后返回对象本身就可以了,我们之前所说的java.lang.StringBuilder就是一个很好的例子,该对象在执行插入、删除、替换等操作的方法体最后会返回对象本身,大家可以通过看java.lang.StringBuilder的源码来更好的理解。

有的同学可能平常都在使用lombok组件,其中get、set方法都是自动编译生成的,那是不是就与我们的fluent编程风格无缘了呢?当然不是,lombok组件中有一个@Buildr注解就是用来实现fluent编程风格的,下面来看看具体实现方式:

import lombok.Builder;import lombok.ToString;@Builder@ToStringpublic class LombokFluentBean {private String id;private String name;}

我们通过添加@Buildr来实现fluent编程,为了方便大家理解,下面为大家贴出编译之后的反编译代码(其中toString方法由@ToString注解生成):

public class LombokFluentBean { private String id; private String name;LombokFluentBean(String id, String name) { this.id = id; this.name = name; }public static LombokFluentBean.LombokFluentBeanBuilder builder() { return new LombokFluentBean.LombokFluentBeanBuilder(); }public String toString() { return "LombokFluentBean(id=" + this.id + ", name=" +this.name + ")"; }public static class LombokFluentBeanBuilder { private String id; private String name;LombokFluentBeanBuilder() { }public LombokFluentBean.LombokFluentBeanBuilder id(String id) { this.id = id;return this; }public LombokFluentBean.LombokFluentBeanBuilder name(String name) {this.name = name; return this; }public LombokFluentBean build() { return new LombokFluentBean(this.id,this.name); }public String toString() { return "LombokFluentBean.LombokFluentBeanBuilder(id="+ this.id + ", name=" + this.name + ")"; } }}

可以看得到lombok组件是通过一个静态内部类实现的,在用法和实现上稍微和我们有些区别,但并不影响我们的使用,大致思路就是使用builder方法获取一个内部类的实例,然后为内部类的属性赋值,注意这里返回的对象本身也是内部类,最后调用内部类的build方法调用外部类的构造函数最终返回外部类对象,具体使用方式如下:

System.out.println(LombokFluentBean.builder().id("1").name("name").build().toString());

执行结果:LombokFluentBean(id=1, name=name)

好了,今天的内容到此结束,各位同学,我们洗漱睡觉!!!

你可能感兴趣的:(流式编程风格,让你的代码更简单)