乐趣区

在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) {}

写在最后

实战中遇到问题,尝试解决问题,然后再到实战中去检验。在工程的道路上,我们还有很多路要走。

退出移动版