当前位置: 首页 > 后端技术 > Java

【Tips】代码优化-动态添加大量扩展字段

时间:2023-04-01 17:23:17 Java

后台接手一个老项目的统计界面,统计最近21周的数据,返回结果是一组数组:[{"A字段":"A1值"","B字段":"B1值","week1":1,"week2":1,"week3":2,......,"week21":3},{"A字段":"A2值","B字段":"B2值","week1":5,"week2":3,"week3":12,...,"week21":7},......]封装的结果对象为:publicclassStatRetClass{privateStringAfield;privateStringBfield;privateIntegerweek1;privateIntegerweek2;......privateIntegerweek21;}之后,业务改为统计最近27周的数据,所以类改为:publicclassStatRetClass{privateStringAfield;privateStringBfield;privateIntegerweek1;privateIntegerweek2;......;私人整数week22;私人整数week23;私人整数week24;私人整数week25;私人整数week26;privateIntegerweek27;}之后修改了很多次,最新的改成了79周。每次修改都要写大量的weekX字段,以及对应的get&set方法(也可以用lombok)。那么有没有办法在尽量少修改代码的情况下支持统计周数的调整。方案weekX字段不是硬编码的,而是在创建对象时动态添加的。这里cglib是用来动态生成属性的。首先将统计的周数提取出来作为配置变量WEEKCOUNT,这样可以通过配置系统动态修改该值。publicstaticTbuildCompareModelDto(Classclazz){MappropertyMap=Maps.newHashMap();IntStream.range(0,WEEKCOUNT).forEach(i->{propertyMap.put("week"+(i+1),Integer.class);});BeanGenerator生成器=newBeanGenerator();generator.setSuperclass(clazz);BeanGenerator.addProperties(generator,propertyMap);return(T)generator.create();}原来的newStatRetClassSub1()和newStatRetClassSub2()分别改为StatRetClass.buildCompareModelDto(StatRetClassSub1.class)和StatRetClass.buildCompareModelDto(StatRetClassSub2.class)。另:cglib生成的属性名总是以$cglib_prop_为前缀,但是get&set方法没有前缀。比如week1生成的属性名是$cglib_prop_week1,但是get方法是getWeek1()。