在spring boot中一种综合查询的新想法
在实际的开发中,会遇到这样的问题:我们在综合查询中,接收到了很多个参数,比如:pageAllOfCurrentUserBySpecification(Long districtId, Long departmentId, String name, String code, Pageable pageable)
,此方法一般的,会被其它多个方法来调用来实现多种查询功能。但如果此方法一旦发生参数变更,那么其它调用它的方法就需要全部跟着变更一边。
示例代码:
public void a(Integer a, Integer b, Integer c) { // 这里是大家统一调用的方法,单元测试的时候,只测试它即可 } public void b(Integer a, Integer b) { a(a, b, null); } public void c(Integer b, Integer c) { a(null, b, c); }
此时,a
方法发生变更,需要增加1个参数d。那么a
,b
,c
三个方法全部要变一边.
public void a(Integer a, Integer b, Integer c, Integer d) { // 这里是大家统一调用的方法,单元测试的时候,只测试它即可 } public void b(Integer a, Integer b) { a(a, b, null, null); } public void c(Integer b, Integer c) { a(null, b, c, null); }
本文旨在探索一种方案来解决此类问题,当a
方法的参数发生变更时,不影响其它调用此方法的方法。
改写代码
interface Params { default Integer getA() { return 0; } default Integer getB() { return 0; } default Integer getC() { return 0; } } public void a(Params params) { System.out.println(params.getA() + params.getB() + params.getC()); } public void b(Integer a, Integer b) { a(new Params() { @Override public Integer getA() { return a; } @Override public Integer getB() { return b; } }); } public void c(Integer b, Integer c) { a(new Params() { @Override public Integer getB() { return b; } @Override public Integer getC() { return c; } }); }
如代码所示,我们将几个参数变成了一个,类型为定义的接口,并且在接口中定义了默认方法,来满足其它方法的调用。
此时,如果我们想在a
方法中,增加一个参数d
,则只需要改写接口及a
方法即可,比如:
interface Params { default Integer getA() { return 0; } default Integer getB() { return 0; } default Integer getC() { return 0; } default Integer getD() { return 0; } } public void a(Params params) { System.out.println(params.getA() + params.getB() + params.getC() + params.getD()); } public void b(Integer a, Integer b) { a(new Params() { @Override public Integer getA() { return a; } @Override public Integer getB() { return b; } }); } public void c(Integer b, Integer c) { a(new Params() { @Override public Integer getB() { return b; } @Override public Integer getC() { return c; } }); }
延伸
不仅如此,我们在接口中定义了默认方法,返回默认数据,就相当于为a
方法定义了默认参数的默认值 。要知道java可是并不支持默认值的。此外,即使参数是主类型我们也不用必须传值了。
主类型传值示例(错误的不合理的演示):
public void b(int a, int b, int c) { } public void c(int b, int c) { b(null, b, c); // 此行会报错,因为null是不可以给int主类型的,此时,我们就只好指定的默认值 b(0, b, c); // 如0。调用的多了,就需要有很多个默认值,哪天默认值变了就要全部修正一遍 }
所以如下的接口方法:
public void a(Params params) {}
相当于:
public void a(Integer a = 0, Integer b = 0, Integer c = 0, Integer d = 0) { }
写在最后
实战中遇到问题,尝试解决问题,然后再到实战中去检验。在工程的道路上,我们还有很多路要走。
原文地址:https://segmentfault.com/a/1190000020347972
相关推荐
-
springboot整合mybatis的多数据源解决办法 Java框架
2019-5-5
-
SpringBoot 实现前后端分离的跨域访问(CORS) Java框架
2020-7-4
-
springcloud之config配置中心-Finchley.SR2版 Java框架
2019-9-18
-
JDK 1.5 – 1.8 各版本的新特性总结 Java框架
2019-3-27
-
【开源】 bsf.mvc spingboot的扩展 Java框架
2020-6-8
-
SpringApplication对象是如何构建的? SpringBoot源码(八) Java框架
2020-6-11
-
springboot + redis(单机版) Java框架
2019-9-18
-
Spring 中的Null-Safety Java框架
2019-6-27
-
mysql解决外网不能连接 Java框架
2019-6-10
-
白话SpringCloud | 第六章:Hystrix监控面板及数据聚合(Turbine) Java框架
2020-6-1