一、前言
1、mybatis的Mapper.class里面,如果我们使用@Param标签,那么代码里面就需要写一个字符串常量createTime:
Long selectCountByTime(@Param("createTime") Date createTime);
private Date createTime;
2、ES写查询条件的时候,我们一般写的查询如下:
BoolQueryBuilder query = QueryBuilders.boolQuery();
if (systemId != null) {
query.filter(QueryBuilders.termQuery("systemId", systemId));
}
如果我们的过滤条件非常多,那么就需要写特别多类似于"systemId"的字符串常量
3、MongoDB写查询条件的时候,我们一般写的查询如下:
Query query = new Query(new Criteria("sequenceId").is(sequenceId)).with(Sort.by(Sort.Order.desc("optTime")));
如果我们写的查询条件非常多,那么也需要写特别多的类似于"sequenceId"的字符串常量。
二、困扰
1、如果Javabean的属性非常多,那么代码里面需要写特别多的字符串常量,并且会零散到代码的各个地方
2、如果Javabean的属性名称改变了,无法进行联动的改动,比如我把createTime改成了updateTime,那么我需要全量搜一下代码,找到使用了createTime常量的地方,然后一一修改。
通过上面我们可以发现这些字符串常量都是我们定义的Javabean的一个属性名,那么有没有一种机制可以自动帮我们生成呢?
三、@FieldNameConstants
1、它是一个Lombok的标签,从v1.16.22版本开始,如果项目上引入了Lombok,那么就可以直接使用了。
2、它的实现效果:
定义一个测试类:
@FieldNameConstants
public class Sub {
private Date createTime;
private Date updateTime;
@FieldNameConstants.Exclude
private Date publishTime;
public static void main(String[] args) {
System.out.println(Sub.Fields.createTime);
System.out.println(Sub.Fields.updateTime);
//下面一行会报错
//System.out.println(Sub.Fields.publishTime);
}
}
运行输出结果:
createTime
updateTime
测试类的编译结果Sub.class:
public class Sub {
private Date createTime;
private Date updateTime;
private Date publishTime;
public Sub() {
}
public static void main(String[] args) {
System.out.println("createTime");
System.out.println("updateTime");
}
public static final class Fields {
public static final String createTime = "createTime";
public static final String updateTime = "updateTime";
private Fields() {
}
}
}
大家发现了没?在Sub类里面新增了Fields 内部类,并且生成了对应的字符串常量,这样当我们的属性名变动之后也能立即发现关联的使用点。