Java链式编程
链式编程的特点是可以通过一个方法调用多个方法,将多个方法调用链接起来,形成一条“链式”,从而提高代码的可读性。
在链式编程中,每个方法的返回类型 应该是调用该方法的对象类型,这样才能够在调用完一个方法后直接接着调用下一个方法。
普通方式使用链式编程
举例说明:
public class Test{public static void main(String[] args){Test test = new Test();test.method1().method2().method3()......}public Test method1(){return new Test();}public Test method2(){return new Test();}public Test method3(){return new Test();}........public void method4(){}
}
上面就可以搞成链式调用:test.method1().method2().method3()......
因为你调完 method1()
后,返回的还是一个对象,刚好这个对象能够调用剩余的方法,然后就这样反复进行,直到终点。假如:test.method1().method4().method3()......
这样就不行了,因为你调 method4()
后,还咋调。
Builder模式实现Java链式编程
Builder模式是一种对象创建模式,允许我们创建一个对象,并设置其属性值。举例:
public class Test {private String paramOne;private String paramTwo;private Test() {} //无参构造public static SampleBuilder builder() {return new SampleBuilder();}//内部类-----------public static class SampleBuilder {private Test sample = new Test();public SampleBuilder withParamOne(String paramOne) {sample.paramOne = paramOne;return this;}public SampleBuilder withParamTwo(String paramTwo) {sample.paramTwo = paramTwo;return this;}public Test build() {return sample;}}//调用public static void main(String[] args) {//使用形式1:Test test = new Test();Test hello = test.builder().withParamOne("Hello").withParamTwo("world!").build();System.out.println(hello.toString());//使用形式2:Test test1 = new Test().builder().withParamOne("Hello").withParamTwo("world!").build();System.out.println(test1.toString());//使用形式3:Test test2 = Test.builder().withParamOne("Hello").withParamTwo("world!").build();System.out.println(test2.toString());}}
虽然调用时,中间 .withParamOne("Hello")、.withParamTwo("world!")
中的返回类型是 this(也就是SampleBuilder 对象)而不是 Test,但是不影响链的调用,因为这个 this 对象也可以调用这个方法啊。
所以相当于 中间隐藏了接收方法调用后的返回结果。
再比如:
@Bean
public Docket getDocket() {//创建Docket对象Docket docket = new Docket(DocumentationType.SWAGGER_2);Docket docket1 = docket.apiInfo(null); //设置Swagger接口文档的首页信息ApiSelectorBuilder select = docket1.select(); //初始化并返回一个API选择构造器ApiSelectorBuilder apis = select.apis(RequestHandlerSelectors.any()); //为任何接口生成API文档ApiSelectorBuilder paths = apis.paths(PathSelectors.any()); //可以根据url路径设置哪些请求加入文档,忽略哪些请求Docket build = paths.build();//创建API文档return build;
}//改写成链式编程为:
@Bean
public Docket getDocket() {Docket docket = new Docket(DocumentationType.SWAGGER_2).apiInfo(null) .select() .apis(RequestHandlerSelectors.any()) .paths(PathSelectors.any()).build();return docket;
}